c# – 使用OrderBy扩展名时的默认比较器

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

OrderBy(x=> x)

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

bool setsEqual = MySet.SequenceEqual(OtherSet);

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

bool setsEqual = MySet.OrderBy(x => x).SequenceEqual(OtherSet.OrderBy(x => x);

但是“比较对象本身”对代码意味着什么呢?由于这个OrderBy扩展方法是通用的,所以必须有一个默认的比较算法能够对对象进行排序而不需要了解更多关于它的东西,这意味着必须将排序的比较委托给集合的类型元素本身.是否存在元素类型必须支持的接口,或者是否存在默认比较器(可能是比较对象的内部存储器地址)?

最佳答案 要回答排序问题:排序使用IComparable< T>如果没有实现,则为
IComperable. IComperable接口强制您实现int CompareTo(对象)方法(如果使用了类型化版本,则使用int CompareTo(T)方法).

元素的顺序由int的符号决定.返回的值解释如下:

> 0:两个对象是等价的(即相同)
> -1:比较对象在此对象之前(即在此对象之前)
> 1:比较对象跟随此对象(即在此对象之后)

忽略实际值,标志就是最重要的.如果您实现自己的IComparable接口,则必须选择排序顺序的语义.

许多对象已经实现了IComparable,就像你的所有数字,字符串等一样.如果你需要对你自己创建的对象进行排序,你需要明确地实现它.如果您打算将这些对象显示在屏幕上的列表中,那么这并不是一种不好的做法.

至于您的具体情况,您只需确定一个集合和另一个IEnumerable是否等效,那么您将使用在标准库集实现中实现的ISet<T>.SetEquals(IEnumerable<T>)方法.根据定义,设置只保证值是唯一的,因此只要元素的数量相同,您只需要检测一个IEnumerable中的所有元素都可以在集合中找到.

点赞