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

Быстрый IComparer?

Прежде чем я перейду на новое колесо, существует ли какой-то каркасный способ создания IComparer<T> из Func<T,T,int>?

ИЗМЕНИТЬ

IIRC (это было время) Java поддерживает анонимные реализации интерфейса. Существует ли такая конструкция в С# или делегаты считаются полной альтернативой?

4b9b3361

Ответ 1

В предстоящем .NET4.5 (Visual Studio 2012) это возможно с помощью статического метода factory Comparer<>.Create. Например

IComparer<Person> comp = Comparer<Person>.Create(
    (p1, p2) => p1.Age.CompareTo(p2.Age)
    );

Ответ 2

Насколько я знаю, такого конвертера нет в рамках платформы .NET 4.0. Вы могли бы написать один самостоятельно, однако:

public class ComparisonComparer<T> : Comparer<T>
{
    private readonly Func<T, T, int> _comparison;

    public MyComparer(Func<T, T, int> comparison)
    {
        if (comparison == null)
            throw new ArgumentNullException("comparison");

        _comparison = comparison;
    }

    public override int Compare(T x, T y)
    {
        return _comparison(x, y);
    }
}

EDIT: Это, конечно, предполагает, что делегат может обрабатывать нулевые аргументы соответствующим образом. Если это не так, вы можете обрабатывать те, что находятся в компараторе, например, изменив тело на:

if (x == null)
{
    return y == null ? 0 : -1;
}

if (y == null)
{
    return 1;
}

return _comparison(x, y);