我正在使用lambda表達式對C#中的數組進行排序和搜索。我不想在我的類中實現IComparer接口,因爲我需要對多個成員字段進行排序和搜索。C#lambda表達式和IComparer
class Widget
{
public int foo;
public void Bar()
{
Widget[] widgets;
Array.Sort(widgets, (a, b) => a.foo.CompareTo(b.foo));
Widget x = new Widget();
x.foo = 5;
int index = Array.BinarySearch(widgets, x,
(a, b) => a.foo.CompareTo(b.foo));
}
}
雖然排序工作正常,二進制搜索給出一個編譯錯誤無法轉換lambda表達式鍵入「System.Collections.IComparer <的Widget >」,因爲它不是一個委託類型。出於某種原因,Sort對IComparer和Comparison都有重載,但BinarySearch只支持IComparer。經過一番研究,我發現了笨重ComparisonComparer<T>
到比較轉換爲的IComparer:
public class ComparisonComparer<T> : IComparer<T>
{
private readonly Comparison<T> comparison;
public ComparisonComparer(Comparison<T> comparison)
{
this.comparison = comparison;
}
int IComparer<T>.Compare(T x, T y)
{
return comparison(x, y);
}
}
這允許二進制搜索的工作方式如下:
int index = Array.BinarySearch(
widgets,
x,
new ComparisonComparer<Widget>((a, b) => a.foo.CompareTo(b.foo)));
呸。有更清潔的方法嗎?
即將到來的.NET4.5有一個方法`的Comparer <> Create`構建一個`的IComparer <>。來自`IComparison <>`委託的實例。 – 2012-08-08 16:44:42