Rag*_*v55 52 .net c# icomparable icomparer
IComparable和IComparerInterfaces有什么区别?是否有必要始终使用此Array.Sort()方法
naw*_*fal 90
顾名思义,IComparable<T>读出来我是可以比较的.IComparable<T>当定义了T可以让你比较了当前实例与同一类型的另一个实例.IComparer<T>读出我是比较器,我比较.IComparer<T>用于比较任何两个实例T,通常在实例的范围之外T.
至于它们的用途可能会让人感到困惑.从定义中可以清楚地看出,因此IComparable<T>(在类T本身中定义)应该是提供排序逻辑的事实上的标准.默认Sort对List<T>等依赖于此.实现IComparer<T>on T无助于定期排序.随后,除了IComparable<T>以外的任何其他类的实现几乎没有价值T.这个:
class MyClass : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
很少有道理.
另一方面
class T : IComparable<T>
{
public int CompareTo(T other)
{
//....
}
}
Run Code Online (Sandbox Code Playgroud)
应该怎么做.
IComparer<T>当您需要基于自定义订单进行排序时,这可能很有用,但不是一般规则.例如,在Person某个阶段,您可能需要根据年龄对人进行排序.在这种情况下,你可以这样做:
class Person
{
public int Age;
}
class AgeComparer : IComparer<Person>
{
public int Compare(Person x, Person y)
{
return x.Age - y.Age;
}
}
Run Code Online (Sandbox Code Playgroud)
现在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.
Run Code Online (Sandbox Code Playgroud)
同样IComparer<T>在T没有任何意义.
class Person : IComparer<Person>
Run Code Online (Sandbox Code Playgroud)
这是真的有效,但对眼睛看起来并不好看并且打败了逻辑.
通常你需要的是IComparable<T>.理想情况下,您可以只有一个,IComparable<T>同时IComparer<T>根据不同的标准可以多个.
的IComparer<T>和IComparable<T>是完全类似IEqualityComparer<T>和IEquatable<T>其中用于测试平等,而不是比较/排序; 这是一个很好的线程,我在那里写了完全相同的答案:)
Kei*_*thS 37
| 归档时间: |
|
| 查看次数: |
54379 次 |
| 最近记录: |