如何在C#中为接口实现IComparer

时间:2013-05-10 03:21:38

标签: c# icomparer

我有一个名为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);

3 个答案:

答案 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