当使用类<T> Vs。IComparer<T>
-
22-08-2019 - |
题
我试图弄清楚这些接口,我需要实施。他们都基本上做同样的事情。当我会用一个比其他?
解决方案
那么,他们都没有的非常的同样的事情IComparer<T>
是一个类型,它能够同时IComparable<T>
是在那些能够将自己与另一实例比较类型实现比较两个不同对象的实现相同的类型。
我倾向于使用IComparable<T>
的时候,我需要知道的另一个实例是如何与this
实例。 IComparer<T>
是作为IComparer<T>
代表所述比较的外排序集合是有用的。
其他提示
当类的特性的比较使用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”要比较基于MathScore学生和教师“B”要比较基于EnglishScore学生。这将是单独实现的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;
}
}
这一切都取决于你的类型是否为可变的。你应该的仅在非可变类型实现IComparable。需要注意的是,如果你实现IComparable,你必须重载equals与==,!=,<和>操作沿(见代码分析警告CA1036)。
但正确答案是落实的IComparer,而不是IComparable的,如果你的对象是可变的,通过IComparer接口的实例来排序功能时必要的。
由于IComparer的仅仅是用于在那个时间点排序一次性的对象,你的对象可以得到你想要的任何可变语义。此外,它并不需要,或者甚至建议使用equals,GetHashCode的,或== - 你是自由的以任何方式来定义它,你请
最后,你可以定义多个的IComparer对你的类型在不同的领域或不同的规则排序。这是更为灵活比陷与一个定义。
简而言之: 使用IComparable的值类型和的IComparer引用类型强>
简单的解释通过一个故事
高中篮球。这是一个学校的院子里挑的队伍。我想要得到的最高/最好/最快的家伙上我的团队。我做什么?
IComparer口 -比两个人单独的人
- 这让我可以比较的任何两个家伙衬里。.....这基本上它。弗雷德vs约翰..........我把他们扔到一个具体的类实现接口。
Compare(Fred, John)
它吐出来是谁更好。
什么类? -比较自己与他人
你有没有在FB最近?你看见其他人在做很酷的东西:周游世界,创造发明,同时我做的东西不是很酷-嗯我们正在做的是,使用的类界面。
- 我们是比较当前实例(己)与另一个目的(他人),这是同一类型的(人)。
什么比较器类?
在比较器类是一个抽象的基类实现IComparer接口。你应该从这类要有一个具体实施。不管怎么说,Microsoft建议您使用的比较器类,而不是实现IComparer的界面:
我们建议你来自的比较器类而不是实施IComparer接口,因为比较器类提供了明确的界面执行IComparer.比较方法和默认的财产,得到默认的比较器的对象。
摘要
- IComparer线上的两个东西进行比较。
- 类-比较自己与他人的FB。
希望的故事帮助你记得。
正如其他人所说,他们不这样做同样的事情。
在任何情况下,这些天我倾向于不使用的IComparer。我为什么要?其职责(用于比较两个对象的外部实体),可干净多了lambda表达式,类似于如何最LINQ的方法工作的处理。编写一个简单的拉姆达更是把要比较的对象作为参数,并返回一个布尔值。如果对象定义了自己的固有的比较操作,可以实现IComparable代替。
IComparable的说,一个对象可以用另一种进行比较。 的IComparer是一个对象,能够比较任意两个项目。
的IComparer是用于排序的阵列一个接口,该接口将强制类来实现 比较(T X,T Y)的方法,这将在两个对象进行比较。这实现了这个接口的类的实例是在该阵列的排序使用。
IComparable的是接口,其中需要相同类型的两个对象比较的类型来实现,这可比接口将强制类来实现以下方法的CompareTo(T OBJ)
的IEqualityComparer是用于找到该对象是否是等于或不一个接口,现在我们将看到这样的样品中,我们必须找到一个鲜明Object的收藏。这个接口实现的方法 等于(T OBJ1,T OBJ2)
现在我们来实施例,我们有一个Employee类,基于此类,所以必须创建集合。现在,我们有以下要求。
使用Array类排序阵列 2.使用LINQ需要一个集合:通过较高的较低删除重复,顺序,删除一个雇员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
{
公众诠释比较(员工X,员工Y)
{
如果(x.Id
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