Как реализовать IComparer в C# для интерфейса

У меня есть интерфейс с именем 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 ответа

Решение

Вы могли бы вместо этого реализовать 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);

Ты можешь сделать

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

Есть ли причина, по которой вы хотите использовать IComparer? У вас есть несколько вариантов, кроме этого.

Прежде всего, вы можете использовать запрос Linq, как описано в @Keith. Это имеет некоторые последствия для памяти, так как новый 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,

Другие вопросы по тегам