Как реализовать 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
,