IComparer, использующий лямбда-выражение - PullRequest
16 голосов
/ 23 мая 2010
 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> в качестве параметра. И это работает с лямбда как показано в строке 2. Но когда я пытаюсь сделать как в строке 1, я получаю эту ошибку:

Невозможно преобразовать лямбда-выражение в тип System.Collections.Generic.IComparer» потому что это не тип делегата

Я исследовал это довольно давно, но до сих пор не понимаю. Может быть, мое понимание IComparer не очень хорошее. Может кто-нибудь помочь мне?

Ответы [ 4 ]

19 голосов
/ 23 мая 2010

Когда вы делаете ll.Sort((x, y) => x.Name.CompareTo(y.Name));, он использует перегрузку для Comparison<T>, а не IComparer.Comparison<T> является делегатом, поэтому вы можете использовать для него лямбда-выражение.

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); будет работать.

5 голосов
/ 25 сентября 2014

Существует существующее решение, на которое вы можете сослаться: https://stackoverflow.com/a/16839559/371531

В этом примере используется Comparer . Создание, представленное в .NET Framework 4.5.

2 голосов
/ 23 мая 2010

IComparer - это интерфейс, а не делегат.

Вы захотите использовать лямбда-выражение в его .CompareTo (), а не в самом интерфейсе.

1 голос
/ 26 августа 2013

Используйте следующий простой класс:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...