2011-08-30 18 views
5

私はこの中でいくつかの項目を移動することができるようにしたいこの非常に単純な配列を持っています。もしそうでなければ、あなたはそれを行う方法の提案を持っています。例では配列の要素を移動する#

var smallArray = new string[4]; 
smallArray[0] = "a"; 
smallArray[1] = "b"; 
smallArray[2] = "c"; 
smallArray[3] = "d"; 

そして、私は(プログラム的に)シフトインデックス2と0、

smallArray[0] = "c"; 
smallArray[1] = "a"; 
smallArray[2] = "b"; 
smallArray[3] = "d"; 

感謝を作成したいと言うことができます。

+0

「シフト」とは「スワップ」を意味しますか? –

+0

duplicate of http://stackoverflow.com/questions/552731/c-good-best-implementation-of-swap-method – hatchet

+0

いいえ、申し訳ありませんが、私の最初の例はちょっとばかげていましたが、例を少し明確にしました今。 –

答えて

12

編集:これで例を変更しました。組み込みのものは何もありません。実際に書き込むには少し痛みがあります。あなたがそれを動かすケースを検討する必要があります「上に」、どこを「下に」移動しているかなどです。あなたはおそらくList<T>の代わりに、あなたが特定のインデックスに挿入し、削除することができます配列を、使用することを検討すべきである

public void ShiftElement<T>(this T[] array, int oldIndex, int newIndex) 
{ 
    // TODO: Argument validation 
    if (oldIndex == newIndex) 
    { 
     return; // No-op 
    } 
    T tmp = array[oldIndex]; 
    if (newIndex < oldIndex) 
    { 
     // Need to move part of the array "up" to make room 
     Array.Copy(array, newIndex, array, newIndex + 1, oldIndex - newIndex); 
    } 
    else 
    { 
     // Need to move part of the array "down" to fill the gap 
     Array.Copy(array, oldIndex + 1, array, oldIndex, newIndex - oldIndex); 
    } 
    array[newIndex] = tmp; 
} 

...あなたはユニットテストをしたいと思いますが、私は、これはそれを行うべきだと思い。これらの2つの操作は、関連するセクションをコピーするだけの場合よりも高価になりますが、読みやすくなります。

+0

実際にそれは私の悪い、私はスワップを意味しなかった、私は新しいインデックスを設定することによって要素の周りを移動することができるようにしたい! (私の例を更新しました)。ありがとう! –

+0

@Trikks:OK、自分のコードを編集しました。しかし、それを完全にテストしてください! –

5

それは既存の質問です:答えは

C# Array Move Item (Not ArrayList/Generic List)

void MoveWithinArray(Array array, int source, int dest) 
{ 
    Object temp = array.GetValue(source); 
    Array.Copy(array, dest, array, dest + 1, source - dest); 
    array.SetValue(temp, dest); 
} 
+0

私はそれを見ましたが、実装に失敗しました。 –

+2

'source

0

これは私の問題を解決し

var arr = new ArrayList 
    { 
     "a", "b", "c", "d", "e", "f" 
    }; 
var first = arr[2]; //pass the value which you want move from 
var next = arr[5]; //pass the location where you want to place 
var m = 0; 
var k = arr.IndexOf(first, 0, arr.Count); 
m = arr.IndexOf(next, 0, arr.Count); 
if (k > m) 
{ 
    arr.Insert(m, first); 
    arr.RemoveAt(k + 1); 
} 
else 
{ 
    arr.Insert(k, next); 
    arr.RemoveAt(m + 1); 
} 

は、B、F、C、Dを返します。 、e

0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SecondLargest 
{ 
    class ArraySorting 
    { 
     public static void Main() 
     { 
     int[] arr={5,0,2,1,0,44,0,9,1,0,23}; 

     int[] arr2 = new int[arr.Length]; 
     int arr2Index = 0; 
     foreach (int item in arr) 
     { 
      if(item==0) 
      { 
       arr2[arr2Index] = item; 
       arr2Index++; 
      } 
     } 
     foreach (int item in arr) 
     { 
      if(item!=0) 
      { 
       arr2[arr2Index] = item; 
       arr2Index++; 
      } 
     } 

     foreach (int item in arr2) 
     { 
      Console.Write(item+" "); 
     } 

      Console.Read(); 

     } 
    } 
} 
+0

Stack Overflowへようこそ!このコードは質問に答えるかもしれませんが、なぜこのコードが質問に答えるか、および/またはどのようにして追加の文脈を提供すれば、長期的な価値が向上します。 – ryanyuyu

関連する問題