需要c#列表排序解释

本文关键字:解释 排序 列表 需要 | 更新日期: 2023-09-27 18:11:23

我有一个问题已经解决了,但我不知道到底发生了什么。下面是一个简化的任务:我有一个记录列表。记录由两个字段组成,一个是key,一个是value。所有的钥匙都不一样。我想对它们进行排序,所以

  • 我有一行空字符串作为key,这应该放在第一位。
  • key
  • 按字母顺序列出value中包含"Key not found"的行
  • 剩下的行按字母顺序按key

所以我创建了这个类:

private class RecordComparer : IComparer<GridRecord>
        {
            public int Compare(GridRecord x, GridRecord y)
            {
                if (x.Key == String.Empty)
                    return -1;
                else if (y.Key == String.Empty)
                    return 1;
                else if (x.Value.Contains("Key not found:") && !y.Value.Contains("Key not found:"))
                    return -1;
                else if (!x.Value.Contains("Key not found:") && y.Value.Contains("Key not found:"))
                    return 1;
                else return (x.Key.CompareTo(y.Key));
            }
        }

当我尝试使用它时,我得到了Comparer (or the IComparable methods it relies upon) did not return zero when Array.Sort called x. CompareTo(x). x: '' x's type: 'GridRecord' The IComparer:
错误并不总是出现,有时(通常是当我在程序中第一次使用它时)它工作得很好。第二个或第三个呼叫崩溃。

插入
if (x.Key == y.Key)
     return 0;

开头的Compare函数解决了上面的问题,一切正常。为什么?

需要c#列表排序解释

如果将{Key=""}与任何内容进行比较,则当前返回的是-1。即使您将它与自身进行比较。当您将某物与自身(或语义上等价的某物)进行比较时,您应该返回0

在自定义比较器中强制执行总顺序是明智的。总序的要求之一是自反性:对于任何x, Compare(x, x)必须等于零。例如,当使用比较器对具有非唯一值的数组进行排序时,需要此属性。

一些库可能会对自定义比较器进行额外的检查。没有必要将元素与自身进行比较,但另一方面,这种检查允许运行时发现细微的错误(比如您犯的错误)。可能这就是你得到错误信息的原因。修复这些错误会使代码更加稳定。通常这样的检查只存在于调试版本中。