【发布时间】:2016-05-02 13:25:01
【问题描述】:
出于好奇:使用以下扩展方法对一堆对象进行排序时使用什么比较器?
OrderBy(x=> x)
背景:我必须检查两个 ISet
bool setsEqual = MySet.SequenceEqual(OtherSet);
方法。由于集合中包含的那些元素的顺序未定义并且可能不同,因此在内部顺序不同的情况下,SequenceEqual 将失败。所以我必须明确定义一个订单。由于订单算法本身是完全不相关的,只要它是稳定的,我只是使用了一个“身份” lambda 表达式:
bool setsEqual = MySet.OrderBy(x => x).SequenceEqual(OtherSet.OrderBy(x => x);
但是“比较对象本身”对代码意味着什么?由于此 OrderBy 扩展方法是通用的,因此必须有一个默认的比较算法,该算法能够在不了解更多对象的情况下对对象进行排序,这意味着必须将排序比较委托给集合的类型元素本身。是否存在元素类型必须支持的接口,或者是否存在默认比较器(可能正在比较对象的内部内存地址)?
【问题讨论】:
-
OrderBy使用Comparer<TKey>.Default,如您所见here -
ISet<T>包含一个SetEquals方法,用于测试序列是否相等。 -
那么,作为对象的直接后代的 TKey 的默认顺序是什么,而不是实现 IComparable?
-
@Udontknow。没有默认顺序 - 默认比较器会抛出异常