4

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

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

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

this.sortIndex.CompareTo(other.sortIndex)

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

  • A1
  • A2
  • B3
  • B2
  • B1

它显然在排序索引的顺序正确的意义上起作用,但我真的不希望它重新排序“B”项。

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

4

5 回答 5

5

如果您不希望等于更改位置的项目,则需要使用“稳定排序”算法。

查看“合并排序”以获取稳定排序算法的示例。这是它在 C# 中的实现

于 2010-04-20T10:30:15.910 回答
5

OrderBy保留相同项目的顺序:

myList = myList.OrderBy(item => item.SortIndex).ToList();
于 2010-04-20T10:34:09.373 回答
2

StableSort()扩展方法List<T>这里

于 2012-05-04T13:36:47.167 回答
1

您可以更改比较器以对值进行二次排序:

if (this.sortIndex.CompareTo(other.sortIndex) == 0) // same sortIndex
{
   return this.Value.CompareTo(other.Value);
}
return 0;
于 2010-04-20T10:33:52.853 回答
1

排序使用快速排序,在比较相等的情况下不保证原始顺序。

如果您仍想使用 List.Sort,您可以添加与原始索引的第二个比较,例如:

int c = this.sortIndex.CompareTo(other.sortIndex);
if (c == 0)
  c = this.originalIndex.CompareTo(other.originalIndex);
return c;

否则,您可以使用其他“稳定”算法(例如 LINQ OrderBy)进行排序。

于 2010-04-20T10:36:34.283 回答