首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -IComparable<T>和IEquatable<T>

C# -IComparable<T>和IEquatable<T>
EN

Stack Overflow用户
提问于 2009-11-14 16:31:31
回答 3查看 3.2K关注 0票数 3

可能重复:

What’s the difference between IComparable & IEquatable interfaces?

IComparable<T>IEquatable<T>的主要区别是什么?什么时候具体使用每一个?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-14 16:33:46

IComparable定义顺序(小于,大于)。它定义的方法是CompareTo,您可以用它来确定两个元素之间的顺序。

IEquatable定义了等式。由它定义的方法等于,它允许您确定两个元素是否相等。

比较示例,按年龄排序人:

代码语言:javascript
复制
public class Person : IComparable<Person>
{
    public int Age { get; set; }
    public int ID { get; set; }

    public int CompareTo(Person other)
    {

        return Math.Sign(Age - other.Age); // -1 other greater than this
                                           // 0 if same age
                                           // 1 if this greater than other
    }
}

排序用法:

代码语言:javascript
复制
[Test]
public void SortTest()
{
    var persons = new List<Person>
                      {
                          new Person { Age = 0 },
                          new Person { Age = 2 },
                          new Person { Age = 1 }
                      };

    persons.Sort();

    Assert.AreEqual(0, persons[0].Age);
    Assert.AreEqual(1, persons[1].Age);
    Assert.AreEqual(2, persons[2].Age);
}

相等示例,用于通过ID识别个人:

代码语言:javascript
复制
public class Person : IEquatable<Person>
{
    public int Age { get; set; }
    public int ID { get; set; }

    public bool Equals(Person other)
    {
        return ID == other.ID;
    }
}
票数 9
EN

Stack Overflow用户

发布于 2009-11-14 16:33:10

如果在IEnumerable<T>,上排序,则使用IComparable<T>, (如果比较两个实例是否相等;IEquatable<T> )

票数 2
EN

Stack Overflow用户

发布于 2009-11-14 16:58:43

通常,任何排序都将使用类的IComparable接口(如果可用的话),否则.Net将应用默认排序,这可能是完全出乎意料的。

如果您不定义一个,那么将使用缺省值--在从IComparable继承的情况下,如果某个基类实现了这一点,那么排序顺序将是基类定义的任何顺序。

IEquatable定义相等,并允许您定义.Net如何确定类的实例是否与Equals方法相等。如果您没有定义一个,那么在默认情况下,等式是基于引用相等的。这意味着,除非您将两个引用与类的同一个实例进行比较,否则它们将不相等,即使您希望它们是相等的。同样,如果您继承了确实实现了接口的基类,并且没有在类中实现它,那么您将使用基类相等计算。

通常,如果要结合使用常见的.Net函数,那么实现这些功能是很重要的。例如,如果您在类的集合上使用class ()函数,那么它将尝试使用IEquatable接口

来自MSDN:

( <(T>)>)接口由泛型集合对象使用,例如Dictionary<( <(TKey,TValue>)>)、List<(<(T>)>和LinkedList<( <(T>)>),它们在测试包含、IndexOf、LastIndexOf和Remove等方法中是否相等时使用。它应该为可能存储在泛型集合中的任何对象实现。

IComparable<(Of <(T>)>)接口提供了一种强类型比较方法,用于排序泛型集合对象的成员。因此,通常不会直接从开发人员代码中调用它。相反,它是由List<(Of <(T>)>)..::.Sort()和Add等方法自动调用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1734737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档