Подтвердить что ты не робот

Список.Сорт с выражением лямбда

Я пытаюсь сортировать часть списка с выражением лямбда, но я получаю сообщение об ошибке при попытке сделать это:

List<int> list = new List<int>();
list.Add(1);
list.Add(3);
list.Add(2);
list.Add(4);

// works fine
list.Sort((i1, i2) => i1.CompareTo(i2) );

// "Cannot convert lambda expression to type 'System.Collections.Generic.IComparer<int>' because it is not a delegate type"
list.Sort(1, 2, (i1, i2) => i1.CompareTo(i2) );

foreach (int i in list)
    Console.WriteLine(i);

Угадайте это, потому что нет перегрузки System.Comparison для сортировки, которая принимает диапазон. Опущено ли это по какой-либо конкретной причине?

Есть ли простой способ получить подходящий IComparer из выражения лямбда (например, класс, который я могу использовать для перехода list.Sort(1, 2, new CompareyThing<int>((...) => ...)) или что-то еще)?

4b9b3361

Ответ 1

Вы можете использовать метод Comparer.Create, хотя это, как представляется, является новым в .Net 4.5

list.Sort(1, 2, Comparer<int>.Create((i1, i2) => i1.CompareTo(i2)));

Вы всегда можете создать свой собственный компаратор:

public class FuncComparer<T> : IComparer<T>
{
    private readonly Func<T, T, int> func;
    public FuncComparer(Func<T, T, int> comparerFunc)
    {
        this.func = comparerFunc;
    }

    public int Compare(T x, T y)
    {
        return this.func(x, y);
    }
}

Тогда ваш код будет выглядеть следующим образом:

list.Sort(1, 2, new FuncComparer<int>((i1, i2) => i1.CompareTo(i2)));

Ответ 2

Вы можете создать пользовательский сопоставитель, если вы не используете .Net 4.5:

class IntComparer : IComparer<int>
{
    public int Compare(int x, int y)
    {
        return x.CompareTo(y);
    }
}
list.Sort(1, 2, new IntComparer());