c# - IComparable 和 IComparer 的区别

标签 c# .net icomparable icomparer

<分区>

IComparableIComparer 接口(interface)有什么区别?是否有必要始终将此接口(interface)与 Array.Sort() 方法一起使用

最佳答案

顾名思义,IComparable<T>读出我是可比的IComparable<T>当为 T 定义时让您比较 当前实例 与另一个相同类型的实例。 IComparer<T>读出我是比较者,我比较IComparer<T>用于比较 T 的任意两个实例,通常在 T 的实例范围之外.

至于它们的用途 一开始可能会令人困惑。从定义中应该清楚,因此 IComparable<T> (在类 T 本身中定义)应该是提供排序逻辑的事实标准。默认 SortList<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/

相关文章:

c# - 如何在更改存储库路径后重置 HintPath

c# - 当映射字段移动到基类时,NHibernate JOIN 映射失败

.net - 嵌入式系统的数据库

c# - Microsoft.Azure.Cosmos.Container.ReadItemAsync() 失败 - json 解析 - 意外字符

c# - 如何在数据行 [] 的列中找到最大值?

c# - 如何发送带有查询字符串的 URL 作为查询字符串

c# - 当前上下文中不存在名称 'ConfigureAuth'

c# - 如何全局声明样式并在 uwp 中的应用程序中使用该样式

c# - 泛型和实现 IComparable

c# - 空参数的 IComparable 行为