如何在c#中为接口实现iccomparer
本文关键字:接口 实现 iccomparer | 更新日期: 2023-09-27 18:12:52
我有一个名为IEmployee
的接口。我需要实现iccomparer来实现我的接口。
这是我的代码,
interface IEmployee
{
String Name {get;set;}
DateTime DOB {get;set;}
}
我已经为它创建了一个子类,比如
class Employee
{
String Name {get;set;}
DateTime DOB {get;set;}
}
现在我需要实现IComparer,在我的Main
中,我想获得比较器,如
IComparer<IEmployee> comparerobject= // The comparer from the class.
使用这个comparer
,我需要根据employee
的名称对它们的集合进行排序,如
var employees = new IEmployee[]{new Employee("....."),....}
Array.Sort<IEmployee>(employees , comparer);
你可以做
var sorted = employees.OrderBy(e => e.Name).ToArray();
或带比较器
public class EmployeeComparer : IComparer<IEmployee>
{
public int Compare(IEmployee x, IEmployee y)
{
return x.Name.CompareTo(y.Name);
}
}
then Array.Sort(employees, new EmployeeComparer());
您可以实现IComparable。然后你的代码看起来像这样:
interface IEmployee : IComparable
{
String Name { get; set; }
DateTime DOB { get; set; }
}
class Employee : IEmployee
{
public string Name { get; set; }
public DateTime DOB { get; set; }
public int CompareTo(object obj)
{
return this.Name.CompareTo(((IEmployee)obj).Name);
}
}
那么你就可以按照下面的顺序对数组进行排序:
Array.Sort<IEmployee>(employees);
您想要使用IComparer
的原因是什么?除此之外,你还有其他选择。
首先,你可以使用@Keith描述的Linq查询。这有一些内存问题,因为必须分配一个新的IEnumerable
。
也许你最好的选择是使用Sort
方法的重载,它接受一个Comparison
对象,它只是一个比较两个对象的委托:
Array.Sort(employees, (a, b) => a.Name.CompareTo(b.Name));
如果你真的想使用IComparer
,那么你需要创建一个实现IComparer<IEmployee>
的类:
public class EmployeeComparer : IComparer<IEmployee>
{
public int Compare(IEmployee e1, IEmployee e2)
{
return e1.Name.CompareTo(e2.Name);
}
}
然后将其用于Sort
方法。如果你愿意,你也可以让Employee
本身实现IComparer
,但这很奇怪,因为它实际上只能实现IComparable
。