使用 OrderBy 扩展时的默认比较器

Udo*_*now 5 c# compare

出于好奇:使用以下扩展方法对一堆对象进行排序时使用了什么比较器?

OrderBy(x=> x)
Run Code Online (Sandbox Code Playgroud)

背景:我必须检查两个 ISet< T > 实例是否包含相同的元素并考虑使用

bool setsEqual = MySet.SequenceEqual(OtherSet);
Run Code Online (Sandbox Code Playgroud)

方法。由于集合中包含的那些元素的顺序未定义并且可能不同,因此在内部顺序不相同的情况下,SequenceEqual 将失败。所以我必须明确定义一个订单。由于顺序算法本身是完全不相关的,只要它是稳定的,我只是使用了一个“身份”lambda 表达式:

bool setsEqual = MySet.OrderBy(x => x).SequenceEqual(OtherSet.OrderBy(x => x);
Run Code Online (Sandbox Code Playgroud)

但是“比较对象本身”对代码意味着什么?由于此 OrderBy 扩展方法是通用方法,因此必须有一个默认的比较算法,该算法能够在不了解更多信息的情况下对对象进行排序,这意味着必须将排序比较委托给集合的类型元素本身。是否有元素类型必须支持的接口,或者是否有默认比较器(可能正在比较对象的内部内存地址)?

Him*_*ere 1

该方法使用IComparable<T>- 或IComparable- 接口,具体取决于两者的实现。如果没有实现,则顺序是任意的。

\n\n

但是,在比较集合之前,您不需要对实例进行排序。只需循环一个集合并检查其所有元素是否包含在另一个集合中。或者使用这个:

\n\n
var areEqual = firstSet.All(x => secondSet.Contains(x)) && secondSet.All(x => firstSet.Contains(x));\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者更简单:

\n\n
var areEqual = !firstSet.Except(secondSet).Any() && !secondSet.Except(firstSet).Any();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这两种方法的执行速度都比您的方法快得多,因为当发现第一个元素不适合时,元素的迭代就会停止。使用OrderByyou\xc2\xb4d 循环所有元素,无论是否已经存在不匹配。

\n