可能是重复内容:
IComparable和IEquatable接口有什么区别?
IComparable<T>
和IEquatable<T>
之间的主要区别是什么?
何时应该具体使用每一个?
可能是重复内容:
IComparable和IEquatable接口有什么区别?
IComparable<T>
和IEquatable<T>
之间的主要区别是什么?
何时应该具体使用每一个?
IComparable 定义了顺序(小于、大于)。它定义的方法是 CompareTo,通过它可以确定两个元素之间的顺序。
IEquatable 定义了相等性。它定义的方法是 Equals,它可以让您确定两个元素是否相等。
比较示例,按年龄对 Person 进行排序:
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;
}
}
如果您正在对 IEnumerable<T>
进行排序,如果要比较两个实例的相等性,请使用 IComparable<T>
;如果要比较两个实例是否相等,则使用 IEquatable<T>
。
.
Math.Sign
实现CompareTo
是非常糟糕的。溢出/下溢 FTW。 - Paul Groke