Ton*_*ion 11 .net sorting collections equality
我写了一大堆对象,这些对象都是集合的一部分,我需要做很多排序和搜索.在大多数这些对象的我已经实现并重写的Equals方法,IEquatable并operator!和operator==.
现在我想要List<T>.Sort在已实现上述所有内容的对象上使用,结果我需要实现IComparable自定义排序.
为什么排序使用IComparable,那么IEquatable在我的所有对象中有什么意义呢?
也没有什么Object.Equal中重写有这一切呢?
Mar*_*ell 14
它不可能用于IEquatable<T>排序 - 知道两件事是否相等并不能帮助你排名.但是,IComparable<T>如果您的类型实现它,或者任何IComparer<T>(包括Comparer<T>.Default)提供自定义比较器对象,它可以使用.函数样式(Comparison<T>)也很方便,无需大量代码进行临时排序:
list.Sort((x,y) => string.Compare(x.Name, y.Name));
Run Code Online (Sandbox Code Playgroud)
但如果您只想要一个简单的序数排序,请使用您的T工具IComparable<T>,并使用:
list.Sort();
Run Code Online (Sandbox Code Playgroud)
平等只能给你两个对象是否相等的结果.它无法告诉您是否x应该y按排序顺序来到之前或之后.鉴于只有平等,你会如何建议List<T>应该进行任何排序?
实现的点IEquatable<T>是当它的平等这一点很重要,例如在HashSet<T>或作为键类型Dictionary<TKey, TValue>.同样,那些不能仅 使用有效实现IComparable<T>,因为它不会提供哈希码.
这两个接口基本上用于不同的情况.