C#-IComparable <t>和IEquatable <t> </t> </t>

时间:2009-11-14 16:31:31

标签: c# generics

  

可能重复:
  What’s the difference between IComparable & IEquatable interfaces?

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

3 个答案:

答案 0 :(得分:9)

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

IEquatable 定义了相等性。它定义的方法是 Equals ,它可以让你确定两个元素是否相等。

比较示例,按年龄排序

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
    }
}

排序用法:

[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识别人员的

平等示例

public class Person : IEquatable<Person>
{
    public int Age { get; set; }
    public int ID { get; set; }

    public bool Equals(Person other)
    {
        return ID == other.ID;
    }
}

答案 1 :(得分:2)

如果你正在使用IEnumerable<T>,使用IComparable<T>,进行排序,如果比较两个实例是否相等; IEquatable<T>

答案 2 :(得分:1)

一般来说,任何排序都会使用你的类的 IComparable 接口,否则.Net将应用默认排序,这可能是完全出乎意料的。
如果你没有定义一个,那么将使用默认值 - 如果你继承了 IComparable 的东西,那么如果某个基类实现了这个,那么排序顺序将是基类定义的。

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

一般来说,如果要将常见的.Net功能与它们结合使用,那么实现这些功能非常重要。例如,如果您对类的集合使用Contains()函数,那么它将尝试使用IEquatable接口

来自MSDN:

  

IEquatable&lt;(&lt;(T&gt;)&gt;)接口   由通用集合对象使用   例如Dictionary&lt;(Of&lt;(TKey,   TValue&gt;)&gt;),List&lt;(Of&lt;(T&gt;)&gt;),和   LinkedList&lt;(Of&lt;(T&gt;)&gt;)测试时   在这些方法中的平等   包含,IndexOf,LastIndexOf和   去掉。它应该实现   任何可能存储在。中的对象   通用集合。

     

IComparable&lt;(Of&lt;(T&gt;)&gt;)接口   提供强类型比较   订购成员的方法   通用集合对象。因为   这通常不会被调用   直接来自开发者代码。代替,   它由方法自动调用   例如List&lt;(Of   &lt;(T&gt;)&gt;).. ::。Sort()()()和Add