我正在尝试弄清楚我需要实现哪个接口,它们基本上都做同样的事情。在什么情况下我会选择使用其中一个而不是另一个?
我正在尝试弄清楚我需要实现哪个接口,它们基本上都做同样的事情。在什么情况下我会选择使用其中一个而不是另一个?
它们并不完全相同,因为 IComparer<T>
实现在能够比较两个不同对象的类型上,而 IComparable<T>
实现在能够将自身与同一类型的其他实例进行比较的类型上。
我倾向于在需要知道另一个实例与 this
实例的关系时使用 IComparable<T>
。而对于排序集合,IComparer<T>
在比较之外非常有用。
IComparable
可以理解为“我是可比较的”,这意味着我可以与其他东西进行比较。而IComparer
则可以理解为“我是一个比较器,我只是比较”,这意味着我会比较一些东西。 - nawfal当一个类具有内在比较时,请使用 IComparable<T>
。
如果想要除了类的内在比较之外的其他比较方法,可以使用IComparer<T>
(如果类有内在比较,则也适用)。
这取决于实体。例如,对于像“学生”这样的类,基于名称的IComparable是有意义的。
class Student : IComparable
{
public string Name { get; set; }
public int MathScore { get; set; }
public int EnglishScore { get; set; }
public int TotalScore
{
get
{
return this.MathScore + this.EnglishScore;
}
}
public int CompareTo(object obj)
{
return CompareTo(obj as Student);
}
public int CompareTo(Student other)
{
if (other == null)
{
return 1;
}
return this.Name.CompareTo(other.Name);
}
}
但是,如果教师'A'想要根据数学成绩比较学生,而教师'B'想要根据英语成绩比较学生。实现单独的IComparer可能是一个好主意。(更像一种策略模式)
class CompareByMathScore : IComparer<Student>
{
public int Compare(Student x, Student y)
{
if (x.MathScore > y.MathScore)
return 1;
if (x.MathScore < y.MathScore)
return -1;
else
return 0;
}
}
简单解释的故事
高中篮球。这是一个选队的场景。我想让身高/实力/速度最好的人来组成我的队伍。该怎么办?
IComparer接口 - 比较两个不同的人
Compare(Fred, John)
,它会输出谁更好。IComparable呢? - 把自己和别人比较
最近有没有看到过Facebook上的其他人做酷炫的事情:环游世界、发明创造,而我做的事情可能不那么酷炫——我们正在使用IComparable接口。
比较器类怎么样?
Comparator类是一个抽象基类,实现了IComparer接口。你应该从这个类派生出一个具体的实现。总之,微软建议你使用比较器类而不是实现IComparer接口:
我们建议您从Comparer类派生,而不是实现IComparer接口,因为Comparer类提供了IComparer.Compare方法和获取对象的默认比较器的Default属性的显式接口实现。
希望这些故事能帮助你记住。
正如其他人所说,它们的作用不同。
无论如何,现在我不太使用IComparer。为什么呢?它的职责(用于比较两个对象的外部实体)可以更清晰地通过lambda表达式来处理,就像LINQ的大多数方法一样。编写一个快速lambda,将要比较的对象作为参数,并返回一个布尔值。如果对象定义了自己的内在比较操作,则可以实现IComparable。
IComparer是一个接口,用于对数组进行排序,这个接口将强制实现类去实现Compare(T x,T y)方法,该方法将比较两个对象。实现了这个接口的类的实例将被用于数组的排序。
IComparable是一个接口,它在需要比较同一类型的两个对象的类型中实现。这个可比较的接口将强制实现类去实现以下方法CompareTo(T obj)
IEqualityComparer是一个接口,它用于查找对象是否相等,现在我们将在一个示例中看到这个接口,我们必须在集合中找到对象的不同之处。该接口将实现一个方法Equals(T obj1,T obj2)
现在我们来举个例子,我们有一个Employee类,基于这个类,我们必须创建一个Collection。现在我们有以下要求。
使用Array类对数组进行排序。 2.使用Linq创建一个Collection:删除重复项,按高到低排序,删除一个员工ID。
abstract public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { set; get; }
}
public enum SortType
{
ByID,
BySalary
}
公共类EmployeeIdSorter : IComparer { public int Compare(Employee x, Employee y) { 如果(x.Id < y.Id) 返回1; else 如果(x.Id > y.Id) 返回-1; else 返回0; } }
这是一个用于比较员工ID的类。如果x的ID小于y的ID,则返回1;如果x的ID大于y的ID,则返回-1;如果两个ID相等,则返回0。 public class EmployeeSalarySorter : IComparer<Employee>
{
public int Compare(Employee x, Employee y)
{
if (x.Salary < y.Salary)
return 1;
else if (x.Salary > y.Salary)
return -1;
else
return 0;
}
}
以下是更多信息,请参见下面链接:http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icomparable-and.html
IComparable表示一个对象可以与另一个对象进行比较。 IComparer是一个可以比较任意两个项目的对象。