IComparable 和 IComparer 之间的区别[重复]

2024-02-03

有什么区别IComparable and IComparer接口?是否有必要始终使用此接口Array.Sort() method


顾名思义,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我在那里写了完全相同的答案:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IComparable 和 IComparer 之间的区别[重复] 的相关文章

随机推荐