如何在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);

如何在c#中为接口实现iccomparer

你可以做

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