35966


string[] stArray = new string[] { "A", "B", "C" , "D" };

→ACBD  
このように  
例えばCをAの後に移動させ  
その後の配列値は順番通りBDと続くような  
配列操作を行うにはどのようにすれば良いのでしょうか？


CC BY-SA 3.0
2017-06-29T07:28:28.083
35963
2017-06-30T21:52:10.507
12778
question
c#
配列内の順番変更を行うには？


配列は固定長ですので、可変長の[`List<T>`クラス](https://msdn.microsoft.com/ja-
jp/library/6sh2ey19\(v=vs.110\).aspx)を使用すると操作しやすいです。

[code]

    var strings = new List<string> { "A", "B", "C", "D", };
    strings.Remove("C");
    strings.Insert(strings.IndexOf("A") + 1, "C");
    Console.WriteLine(String.Concat(strings));
    // → ACBD
    
[/code]

また`ToArray()`メソッドを使用すれば配列に変換できます。

* * *

pgrhoさんが指摘されるように私の回答では`Remove()`メソッドで前に詰める際のコピーと`Insert()`メソッドで後ろにずらす際のコピーとが発生するため、`MoveElement<T>()`のようなメソッドを利用した方が効率はいいです。  
ただし、呼び出し回数が少ないのであればその差による影響も小さく、`MoveElement<T>()`のように行いたい操作に応じたメソッドをそれぞれ用意するか既存の`Remove()`
`Insert()`などで簡単に済ますかは考慮の余地があります。  
逆に呼び出し回数が多ければ影響も大きくなりますが、今度は配列全体に渡る操作になっているはずであり、`MoveElement<T>()`のようなメソッドを利用するのではなくアルゴリズム自体を見直すべきです。


CC BY-SA 3.0
2017-06-29T07:40:14.807
35966
2017-06-30T21:52:10.507
2017-06-30T21:52:10.507
4236
4236
35963
answer


配列の１番目の要素`"B"`と２番目の`"C"`を入れ替えるには次のようにします。

[code]

    string temp = stArray[2];
    stArray[2] = stArray[1];
    stArray[1] = temp;
    
[/code]

[デモ](http://ideone.com/QQ5lqO)


CC BY-SA 3.0
2017-06-29T07:57:01.263
35967
2017-06-29T07:57:01.263
5044
35963
answer


新しい配列を作成せずに特定のインデックスの要素を別のインデックスに移動し、間にある要素を前または後ろにずらす場合、以下のような操作になります。

[code]

    static void MoveElement<T>(T[] array, int currentIndex, int newIndex)
    {
        // 現在の要素の値を退避する
        var temp = array[currentIndex];
    
        // 移動方向を判定する
        if (currentIndex < newIndex)
        {
            // currentIndex＜i≦newIndexの要素を1個ずつ前方へ移動する
            Array.Copy(array, currentIndex + 1, array, currentIndex, newIndex - currentIndex);
        }
        else
        {
            // newIndex≦i＜currentIndexの要素を1個ずつ後方へ移動する
            Array.Copy(array, newIndex, array, newIndex + 1, currentIndex - newIndex);
        }
    
        // 退避した値をnewIndexに設定
        array[newIndex] = temp;
    }
    
[/code]

間の要素の移動には`Array.Copy`を使用していますが、一般のリストであれば`for`ステートメントを使用することになります。

`List<T>`での削除や挿入は対象インデックス以降のすべての要素を移動することになりますので、削除と挿入を組み合わせて移動を行うと後方の本来移動しなくてよい要素も前後に2回コピーされることになります。ですリストの要素数が多い場合は明示的に操作した方が効率が良くなります。


CC BY-SA 3.0
2017-06-29T08:47:39.197
35968
2017-06-29T09:02:42.470
2017-06-29T09:02:42.470
5750
5750
35963
answer