需要c#列表排序解释
本文关键字:解释 排序 列表 需要 | 更新日期: 2023-09-27 18:11:23
我有一个问题已经解决了,但我不知道到底发生了什么。下面是一个简化的任务:我有一个记录列表。记录由两个字段组成,一个是key
,一个是value
。所有的钥匙都不一样。我想对它们进行排序,所以
- 我有一行空字符串作为
key
,这应该放在第一位。 -
key
按字母顺序列出 - 剩下的行按字母顺序按
key
。
value
中包含"Key not found"的行所以我创建了这个类:
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函数解决了上面的问题,一切正常。为什么?
如果将{Key=""}
与任何内容进行比较,则当前返回的是-1
。即使您将它与自身进行比较。当您将某物与自身(或语义上等价的某物)进行比较时,您应该返回0
。
在自定义比较器中强制执行总顺序是明智的。总序的要求之一是自反性:对于任何x
, Compare(x, x)
必须等于零。例如,当使用比较器对具有非唯一值的数组进行排序时,需要此属性。
一些库可能会对自定义比较器进行额外的检查。没有必要将元素与自身进行比较,但另一方面,这种检查允许运行时发现细微的错误(比如您犯的错误)。可能这就是你得到错误信息的原因。修复这些错误会使代码更加稳定。通常这样的检查只存在于调试版本中。