これらの個々の移動をすべて行うのは非効率的です。それを行うためのより良い方法は、単一のメソッドでオブジェクトのスパンを行うことですArray.Copy
。
リストの代わりに配列を使用して作業するList<T>
かのように使用RemoveAt
しますInsert
public static void MoveIndex<T>(this T[] array, int sourceIndex, int destIndex)
{
//Some sanity checks before we start.
var arrayLength = array.Length;
if(sourceIndex >= arrayLength || destIndex >= arrayLength || sourceIndex < 0 || destIndex < 0)
throw new IndexOutOfRangeException("The indexes must be within the array);
if(sourceIndex == destIndex)
throw new ArgumentException("The two indexes must not have the same value");
//Store for later useage
var temp = array[sourceIndex];
int offset;
int length;
//Figure out if we are moving left or right
if(souceIndex < destIndex)
{
offset = -1;
length = destIndex - sourceIndex;
}
else
{
offset = 1;
length = sourceIndex - destIndex;
}
//"Move" the elements that need shifting
Array.Copy(array, sourceIndex, array, sourceIndex + offset, length);
//put back the item that we stored earlier;
array[destIndex] = temp;
}
コレクションを作成できる場合、そのMove関数ObservableCollection<T>
にこれが組み込まれています