顾名思义,IComparable<T>
读出我有可比性. IComparable<T>
当定义为T
让你compare the 当前实例与相同类型的另一个实例。IComparer<T>
读出我是一个比较者,我比较. IComparer<T>
用于比较任意两个实例T
,通常超出实例的范围T
.
As to 他们的用途是什么一开始可能会令人困惑。从定义中应该清楚的是,因此IComparable<T>
(在类中定义T
本身)应该是提供排序逻辑的事实上的标准。默认Sort
on List<T>
等等都依赖于此。实施IComparer<T>
on T
无助于常规排序。随后,实施价值不大IComparable<T>
除以下任何其他类别T
. This:
class MyClass : IComparable<T>
很少有道理。
另一方面
class T : IComparable<T>
{
public int CompareTo(T other)
{
//....
}
}
应该如何做。
IComparer<T>
当您需要根据自定义顺序进行排序时可能很有用,但不作为一般规则。例如,在一个类中Person
在某些时候,您可能需要根据年龄对人们进行排序。在这种情况下你可以这样做:
class Person
{
public int Age;
}
class AgeComparer : IComparer<Person>
{
public int Compare(Person x, Person y)
{
return x.Age - y.Age;
}
}
Now the AgeComparer
有助于对列表进行排序Age
.
var people = new Person[] { new Person { age = 23 }, new Person(){ age = 22 } };
people.Sort(p, new AgeComparer()); //person with age 22 comes first now.
相似地IComparer<T>
on T
没有意义。
class Person : IComparer<Person>
确实,这可行,但看起来不太好,而且不符合逻辑。
通常你需要的是IComparable<T>
。理想情况下,您只能拥有一个IComparable<T>
同时多个IComparer<T>
根据不同的标准是可能的。
The IComparer<T>
and IComparable<T>
完全类似于IEqualityComparer<T>
and IEquatable<T>
用于测试相等性而不是比较/排序;一个好线程here https://stackoverflow.com/questions/9316918/what-is-the-difference-between-iequalitycomparert-and-iequatablet我在那里写了完全相同的答案:)