IComparer с использованием выражения Lambda
class p {
public string Name { get; set; }
public int Age { get; set; }
};
static List<p> ll = new List<p>
{
new p{Name="Jabc",Age=53},new p{Name="Mdef",Age=20},
new p{Name="Exab",Age=45},new p{Name="G123",Age=19}
};
protected static void SortList()
{
IComparer<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); <==(Line 1)
ll.Sort((x, y) => x.Name.CompareTo(y.Name));<==(Line 2)
}
Здесь List.sort ожидает параметр IComparer<p>
as. И он работает с лямбдой
как показано в строке 2. Но когда я пытаюсь сделать так, как в строке 1, я получаю эту ошибку:
Невозможно преобразовать лямбда-выражение в тип System.Collections.Generic.IComparer" потому что это не тип делегата
Я исследовал это довольно долгое время, но я до сих пор этого не понимаю. Может быть, мое понимание IComparer не очень хорошо. Может кто-нибудь дать мне руку?
Ответы
Ответ 1
Когда вы выполняете ll.Sort((x, y) => x.Name.CompareTo(y.Name));
, он использует перегрузку для Comparison<T>
, а не IComparer
. Comparison<T>
является делегатом, поэтому вы можете использовать для него лямбда-выражение.
Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name);
будет работать.
Ответ 2
Есть существующее решение, к которому вы можете обратиться: fooobar.com/questions/133429/...
В этой версии используется Comparer <T> .Create, представленная в .NET Framework 4.5.
Ответ 3
IComparer - это интерфейс, а не делегат.
Вы хотите использовать выражение лямбда на своем .CompareTo(), а не на самом интерфейсе.
Ответ 4
Используйте следующий простой класс:
public static class ComparerUtilities
{
class _Comparer<T> : Comparer<T>
{
Comparison<T> _comparison;
public _Comparer(Comparison<T> comparison)
{
_comparison = comparison;
}
public override int Compare(T x, T y)
{
return _comparison(x, y);
}
}
public static IComparer<T> FromComparison<T>(Comparison<T> comparison)
{
return new _Comparer<T>(comparison);
}
}