<分区>
IComparable
和IComparer
接口(interface)有什么区别?是否有必要始终将此接口(interface)与 Array.Sort()
方法一起使用
<分区>
IComparable
和IComparer
接口(interface)有什么区别?是否有必要始终将此接口(interface)与 Array.Sort()
方法一起使用
最佳答案
顾名思义,IComparable<T>
读出我是可比的。 IComparable<T>
当为 T
定义时让您比较 当前实例 与另一个相同类型的实例。 IComparer<T>
读出我是比较者,我比较。 IComparer<T>
用于比较 T
的任意两个实例,通常在 T
的实例范围之外.
至于它们的用途 一开始可能会令人困惑。从定义中应该清楚,因此 IComparable<T>
(在类 T
本身中定义)应该是提供排序逻辑的事实标准。默认 Sort
在 List<T>
etc 依赖于此。实现 IComparer<T>
在 T
不利于定期排序。随后,实现 IComparable<T>
的值(value)不大在除 T
以外的任何其他类别上.这:
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;
}
}
现在 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>
在 T
没有意义。
class Person : IComparer<Person>
确实这可行,但看起来不好看并且不符合逻辑。
通常你需要的是IComparable<T>
.同样理想情况下,您只能拥有一个 IComparable<T>
同时多个 IComparer<T>
可能基于不同的标准。
IComparer<T>
和 IComparable<T>
完全类似于 IEqualityComparer<T>
和 IEquatable<T>
用于测试相等性而不是比较/排序;好线程here我在那里写了完全相同的答案:)
关于c# - IComparable 和 IComparer 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5980780/