MoveupおよびMoveDownを使用したOrderedCollection

.net c#
MoveupおよびMoveDownを使用したOrderedCollection

アイテムの Move-Up`と Move-Down`をサポートする組み込みのOrdered Collectionはありますか?

私は注文したコレクション(リストになる可能性があります)を持ちたいのですが、アイテムを挿入するとそれが確実になります

コレクションの最後に挿入すると、このようなことができるようになりたい

Col.MoveUp(Item1);//Takes Item1 and move its index one step up.
                  //if its index is 3 it will be 2 and item on index 2 will be 3
Col.MoveDown(item2);

  0  1


ベストアンサー

独自のビルドは非常に簡単です。 ここでは、拡張メソッドとして作成しました。 別のオプションは、独自のコレクションを定義し、Listからそれを継承し、そこにこれらのメソッドを挿入することです。

public static class ListExtensions
{
    public static void MoveUp(this List list, T item)
    {
        int index = list.IndexOf(item);

        if (index == -1)
        {
            // item is not in the list
            throw new ArgumentOutOfRangeException("item");
        }

        if (index == 0)
        {
            // item is on top
            return;
        }

        list.Swap(index, index - 1);
    }

    public static void MoveDown(this List list, T item)
    {
        int index = list.IndexOf(item);

        if (index == -1)
        {
            // item is not in the list
            throw new ArgumentOutOfRangeException("item");
        }

        if (index == list.Count - 1)
        {
            // item is no bottom
            return;
        }

        list.Swap(index, index + 1);
    }

    private static void Swap(this List list, int i1, int i2)
    {
        T temp = list[i1];
        list[i1] = list[i2];
        list[i2] = temp;
    }
}

3


通常、接頭辞「Ordered」はソートされたコレクションに使用されますが、これは望ましくありません。

標準の `List <>`と数行のコードを使用できます:

//untested
// Extension method, place in public static class.
public static void MoveDown(this IList list, int index)
{
   if (index >= list.Count) ... // error
   if (index > 0)
   {
       var temp = list[index];
       list.RemoveAt(index);
       list.Insert(index - 1, temp);
   }
}

そして、それを次のように使用します

var data = new List();
...
data.MoveDown(2);

これにより、アイテムがインデックス2からインデックス1に移動します。 +上下の逆の概念を使用していることに気付きました。これは選択です。

1


特に境界ケースを考慮に入れて、単純なスワッピングで同じことができる場合、このような組み込みのものはないと思います。

既存のコレクションの1つを拡張して目的のメソッドを追加する独自のコレクションを実装することもできます。

0


タイトルとURLをコピーしました