Ответ 1
В предстоящем .NET4.5 (Visual Studio 2012) это возможно с помощью статического метода factory Comparer<>.Create
. Например
IComparer<Person> comp = Comparer<Person>.Create(
(p1, p2) => p1.Age.CompareTo(p2.Age)
);
Прежде чем я перейду на новое колесо, существует ли какой-то каркасный способ создания IComparer<T>
из Func<T,T,int>
?
ИЗМЕНИТЬ
IIRC (это было время) Java поддерживает анонимные реализации интерфейса. Существует ли такая конструкция в С# или делегаты считаются полной альтернативой?
В предстоящем .NET4.5 (Visual Studio 2012) это возможно с помощью статического метода factory Comparer<>.Create
. Например
IComparer<Person> comp = Comparer<Person>.Create(
(p1, p2) => p1.Age.CompareTo(p2.Age)
);
Насколько я знаю, такого конвертера нет в рамках платформы .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);