我有一个通用列表中的项目列表:
它们上的比较器采用以下形式:
this.sortIndex.CompareTo(other.sortIndex)
当我在项目列表上执行List.Sort()时,我得到以下顺序:
显然,排序索引的顺序是正确的,但我真的不希望它重新排序“B”项。
我可以对比较器进行调整以解决这个问题吗?
答案 0 :(得分:5)
如果您不希望项目等于更改位置,则需要使用“stable sort”算法。
查看“merge sort”以获取稳定排序算法的示例。这是C#中的an implementation。
答案 1 :(得分:5)
OrderBy
保留相同项目的订单:
myList = myList.OrderBy(item => item.SortIndex).ToList();
答案 2 :(得分:2)
StableSort()
的{{1}}扩展方法为here
答案 3 :(得分:1)
您可以更改比较器以对值进行二级排序:
if (this.sortIndex.CompareTo(other.sortIndex) == 0) // same sortIndex
{
return this.Value.CompareTo(other.Value);
}
return 0;
答案 4 :(得分:1)
Sort使用QuickSort,并且在比较相等的情况下不保证原始序列。
如果您仍想使用List.Sort,您可以添加与原始索引的第二个比较,如:
int c = this.sortIndex.CompareTo(other.sortIndex);
if (c == 0)
c = this.originalIndex.CompareTo(other.originalIndex);
return c;
否则您可以使用其他“稳定”算法(例如LINQ OrderBy)进行排序。