配列内の順番変更を行うには？


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

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




配列は固定長ですので、可変長の[`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>()`のようなメソッドを利用するのではなくアルゴリズム自体を見直すべきです。




配列は固定長ですので、可変長の[`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>()`のようなメソッドを利用するのではなくアルゴリズム自体を見直すべきです。

