C#:Comparer Int List(元素原点位置)

时间:2015-06-30 09:29:50

标签: c# list compare

我每天比较物品,但我的日子是相同的。 我有一个列表,例如:

  • 第1项:第1天
  • 第2项:第1天
  • 第3项:第1天
  • 第4项:第1天
  • 第5项:第1天
  • 第6项:第1天
  • 第7项:第1天
  • 第8项:第1天

我的比较器:我每天比较它

public class byDay : Comparer<int> { public override int Compare(int day1, int day2) {
if (day2 - day1 > 0) { return -1; } if (day2 - day1 < 0) { return 1; }
return 0; }

最后,我的列表每天的顺序不一样,但却相同。

  • 第1项:第1天
  • 第6项:第1天
  • 第3项:第1天
  • 第7项:第1天
  • 第8项:第1天
  • 第2项:第1天
  • 第4项:第1天
  • 第5项:第1天

我注意到“比较器”不一定比较下一个对象。例如:第1项为第2项,第1项为第4项。

因此,我的列表通常不应更改,但保留原始顺序的日期相同。

“return 0”不应改变列表中元素的位置???

1 个答案:

答案 0 :(得分:1)

错误行为的起源是默认排序算法(QuickSort)不是稳定。可能的 Linq 解决方案(按顺序)是按索引排序:

  // TODO: put the actual type here
  List<DateTime> source = ....

  List<DateTime> result = source
   .Select(item, index => new { // <- data itself + index
      item = item,
      index = index 
     })
   .OrderBy(data => data.item) // <- by day, date, etc.
   .ThenBy(data => data.index) // <- on tie by index
   .Select(data => data.item)  // <- return to original type
   .ToList();

缺点:创建一个新列表istance(result)。如果您希望整理现有列表,则必须实现任何稳定排序算法(QuickSort除外),例如: 合并排序

https://en.wikipedia.org/wiki/Merge_sort