为什么我在C#中的List.Sort方法颠倒了我的列表顺序?

时间:2010-04-20 10:26:35

标签: c# .net sorting icomparable

我有一个通用列表中的项目列表:

  • A1(排序索引1)
  • A2(排序索引2)
  • B1(排序索引3)
  • B2(排序索引3)
  • B3(排序索引3)

它们上的比较器采用以下形式:

this.sortIndex.CompareTo(other.sortIndex)

当我在项目列表上执行List.Sort()时,我得到以下顺序:

  • A1
  • A2
  • B3
  • B2
  • B1

显然,排序索引的顺序是正确的,但我真的不希望它重新排序“B”项。

我可以对比较器进行调整以解决这个问题吗?

5 个答案:

答案 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)进行排序。