微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

List <T> Sort使用Comparer <T>而不是IEquatable,为什么?

如何解决List <T> Sort使用Comparer <T>而不是IEquatable,为什么?

| 我已经写了一大堆对象,它们都是集合的一部分,在这些对象上我需要进行大量的排序和搜索。在大多数这些对象上,我已经实现并覆盖了
Equals
方法
IEquatable
operator!
operator==
。 现在我开始想在已实现上述所有内容的对象上使用
List<T>.sort
,结果我需要实现
IComparable
来进行自定义排序。 为什么Sort要使用
IComparable
,然后在我所有的对象中使用
IEquatable
又有什么意义呢?
Object.Equal
压倒一切与这一切有什么关系?     

解决方法

它不可能使用ѭ9进行排序-知道两件事是否相等并不能帮助您对它们进行排名。但是,如果您的类型实现了它,则可以使用
IComparable<T>
,也可以使用任何
IComparer<T>
(包括
Comparer<T>.Default
)来提供自定义比较器对象。功能样式(
Comparison<T>
)也很方便,无需大量代码即可进行临时排序:
list.Sort((x,y) => string.Compare(x.Name,y.Name));
但是,如果您只想进行简单的序数排序,请使用
T
实现
IComparable<T>
,然后使用:
list.Sort();
    ,相等只能给您两个对象是否相等的结果。它无法告诉您
x
应该排在
y
之前还是之后。仅考虑相等性,您如何建议ѭ20应该执行任何排序? 实现ѭ9的关键是要保证等式的重要性,例如在
HashSet<T>
中作为键类型或在
Dictionary<TKey,TValue>
中作为键类型。同样,仅使用ѭ10不能有效地实现这些功能,因为它不提供哈希码。 这两个接口基本上用于不同的情况。     ,因为
IComparable
可以确定一个对象比另一个对象“小”或“大”,而
IEquatable
则有助于确定两个对象是否等于“相等”。 前者是排序所需要的,因为仅知道哪些对象具有相等的值并不能帮助您将它们按特定顺序放置。     ,因为排序不仅仅取决于平等,还取决于相对等级。为了排序,您需要知道对象相对于彼此的位置。大于,小于,等于。     ,好吧,正如您在与此主题有关的其他问题中所看到的那样,
IEquatable<T>
检查是否相等,而
IComparable<T>
则引入了排序所需的等级。     ,使用
IEquatable
接口可以定义等价关系,但要进行排序则需要排序。     ,平等告诉您两个实例是否相等。可比性告诉您如何对它们进行排序。 当您比运行时更了解类型对您的相等性起作用时,可以覆盖实例版本的“ 30”。 引用类型的相等默认为“引用相等”(相同的引用是同一对象)。
object o1 = new object();
object o2 = o1;

if(o2==o1)
{
    Console.WriteLine(\"These reference types are equal\");
}

object o3 = new object();

if(o2 != o3)
{
    Console.WriteLine(\"These reference types are not equal\");
}
值类型的默认相等意味着所有成员变量都相等。通常,您应该覆盖值类型的“等于”,因为您可能会更好地了解“等于”的含义。 这如何影响可比性是可比性在某种程度上依赖于平等。为了知道小于或大于等于意味着什么,需要知道等于等于。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。