带有Moveup和MoveDown的OrderedCollection

时间:2011-07-12 11:56:10

标签: c# .net

是否有支持Move-UpMove-Down项目的内置订购代码?

我想要Ordered Collection(可能是List),我可以肯定当我插入物品时它将是

在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);

3 个答案:

答案 0 :(得分:3)

建立自己的非常容易。在这里,我将它们作为扩展方法。另一个选择是定义您自己的集合,从List继承它并在那里插入这些方法。

public static class ListExtensions
{
    public static void MoveUp<T>(this List<T> 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<T>(this List<T> 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<T>(this List<T> list, int i1, int i2)
    {
        T temp = list[i1];
        list[i1] = list[i2];
        list[i2] = temp;
    }
}

答案 1 :(得分:1)

前缀'Ordered'通常用于已排序的集合,您不希望这样。

您可以使用标准List<>和几行代码:

//untested
// Extension method, place in public static class.
public static void MoveDown(this IList<T> 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<string>();
...
data.MoveDown(2);

这会将项目从索引2移动到索引1 我刚刚意识到我使用了反转的上/下概念,这是一个选择。

答案 2 :(得分:0)

我认为没有像这样的内置内容,特别是考虑到边界情况时,通过简单的交换可以做到同样的事情。

您可能希望实现自己的Collection,扩展其中一个现有集合以添加所需的方法。