我有一个名为IEmployee
的界面。我需要实现IComparer来实现我的接口。
这是我的代码,
interface IEmployee
{
String Name {get;set;}
DateTime DOB {get;set;}
}
我为此创建了一个子类,如
class Employee
{
String Name {get;set;}
DateTime DOB {get;set;}
}
现在我需要实现IComparer,在我的Main
我希望得到像这样的copmarer
IComparer<IEmployee> comparerobject= // The comparer from the class.
使用此comparer
我需要根据名称对employee
的集合进行排序,例如
var employees = new IEmployee[]{new Employee("....."),....}
Array.Sort<IEmployee>(employees , comparer);
答案 0 :(得分:7)
您可以改为实施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);
答案 1 :(得分:4)
你可以做到
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);
}
}
然后Array.Sort(employees, new EmployeeComparer());
答案 2 :(得分:2)
您是否有理由使用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
。