IComparable和IComparer之间的区别

Rag*_*v55 52 .net c# icomparable icomparer

IComparableIComparerInterfaces有什么区别?是否有必要始终使用此Array.Sort()方法

naw*_*fal 90

顾名思义,IComparable<T>读出来我是可以比较的.IComparable<T>当定义了T可以让你比较当前实例与同一类型的另一个实例.IComparer<T>读出我是比较器,我比较.IComparer<T>用于比较任何两个实例T,通常在实例的范围之外T.

至于它们的用途可能会让人感到困惑.从定义中可以清楚地看出,因此IComparable<T>(在类T本身中定义)应该是提供排序逻辑的事实上的标准.默认SortList<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>其中用于测试平等,而不是比较/排序; 这是一个很好的线程,我那里写了完全相同的答案:)

  • 谢谢您的回答.我有一个问题:"MyClass类:IComparable <T>很少有意义." 为什么不 - 它有什么问题? (2认同)
  • @BKSpurgeon 因为`IComparable&lt;T&gt;` 旨在为`T` 的实例提供*默认* 顺序。这不仅是“IComparable”这个名字的意义所在,而且从“IComparable”上的“CompareTo”方法的定义中可以明显看出这一点。定义是`public int CompareTo(T)`,这样你就可以做`jon.CompareTo(mark)`,jon &amp; mark 当然是人。当你写的时候,`class RandomClass : IComparable&lt;SomethingElse&gt;`,你的 `CompareTo` 让代码看起来像 `refrigerator.CompareTo(parrot)`。虽然从技术上讲,您可能在某个地方需要它,但 .NET 世界不会那样做。 (2认同)

Kei*_*thS 37

  • IComparable - 使用CompareTo()方法为对象定义接口,该方法接受相同类型的另一个对象,并将当前对象与传递的对象进行比较.它将比较内部化到对象,允许更内联的比较操作,并且当只有一种逻辑方式或绝大多数常见的默认方式来比较类型的对象时,它非常有用.
  • IComparer - 使用Compare()方法定义一个接口,该方法接受另一个类型的两个对象(不必实现IComparable)并比较它们.这使得比较外部化,并且当有许多可行的方法来比较类型的两个对象时,或者当类型没有实现IComparable时(或者IComparable实现比你想要的方式不同)并且你没有控制该类型的来源.


Ken*_*isa 15

我读过的最好的解释是"要排序的对象将实现IComparable,而要对对象进行排序的类将实现IComparer." (来源)

如果你想进行排序没有实现IComparable的对象,你需要创建一个实现IComparer接口(和接受这些对象类型进行比较)一类,它通过传递给Array.sort()方法.


nik*_*owj 7

IComparable用于为对象提供默认排序顺序.

IComparer是提供额外的比较机制.

看这篇文章以供参考. http://support.microsoft.com/kb/320727


归档时间:

查看次数:

54379 次

最近记录:

7 年,9 月 前