是否有支持Move-Up
和Move-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);
答案 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,扩展其中一个现有集合以添加所需的方法。