Лямбда-выражения C # и IComparer

Я использую лямбда-выражения для сортировки и поиска в массиве на C #. Я не хочу реализовывать интерфейс 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));
    }
}

Хотя сортировка работает нормально, двоичный поиск дает ошибку компиляции Не удается преобразовать лямбда-выражение в введите System.Collections.IComparer , поскольку это не тип делегата . По какой-то причине в Sort есть перегрузки для IComparer и Comparison, но BinarySearch поддерживает только IComparer. После некоторого исследования я обнаружил неуклюжий ComparisonComparer для преобразования Comparison в 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)));

Уф. Есть способ чище?

17
задан Justin Morgan 2 February 2011 в 02:25
поделиться