15

I'm trying to sort part of a list with a lambda expression, but I get an error when trying to do so:

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

At a guess this is because there's no System.Comparison overload for the sort that takes a range. Is this omitted for any particular reason?

Is there an easy way of getting a suitable IComparer from the lambda expression (like a class I can just use to go list.Sort(1, 2, new CompareyThing<int>((...) => ...)) or something)?

user673679
  • 1,327
  • 1
  • 16
  • 35
  • I'm potentially a total dumbass, but I don't understand what you're trying to accomplish with `list.Sort(1, 2, (i1, i2) => i1.CompareTo(i2) );`. Could you elaborate? – tmesser Nov 27 '12 at 22:43
  • The ints are just for example purposes. In my actual code, I'm trying to compare an int property of a class. – user673679 Nov 27 '12 at 22:49
  • You can use following code `list.Sort(new Comparison((i1, i2) => i1 - i2));` – Andrey Burykin Nov 16 '21 at 15:13

2 Answers2

20

You can use the Comparer.Create method, although this appears to be new in .Net 4.5

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

You can always create your own comparer:

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

Then your code would be:

list.Sort(1, 2, new FuncComparer<int>((i1, i2) => i1.CompareTo(i2)));
Lee
  • 142,018
  • 20
  • 234
  • 287
5

You could create a custom comparer if you're not using .Net 4.5:

class IntComparer : IComparer<int>
{
    public int Compare(int x, int y)
    {
        return x.CompareTo(y);
    }
}
list.Sort(1, 2, new IntComparer());
Tim Schmelter
  • 450,073
  • 74
  • 686
  • 939