-1

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

3 回答 3

9

您可以改为实现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);
于 2013-05-10T03:42:52.283 回答
9

你可以做

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());

于 2013-05-10T03:31:56.340 回答
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.

于 2013-05-10T03:48:33.770 回答