ラムダ式を使用してリストの一部を並べ替えようとしていますが、そうしようとするとエラーが発生します。
_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>((...) => ...))
などに移動するために使用できるクラスのように)?
Comparer.Create メソッドを使用できますが、これは.Net4.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)));
.Net 4.5を使用していない場合は、カスタム比較ツールを作成できます。
class IntComparer : IComparer<int>
{
public int Compare(int x, int y)
{
return x.CompareTo(y);
}
}
list.Sort(1, 2, new IntComparer());