Estoy usando expresiones lambda para ordenar y buscar una matriz en C#. No quiero implementar la interfaz IComparer en mi clase, porque necesito ordenar y buscar en múltiples campos de miembros.C# expresiones lambda y 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));
}
}
Mientras que el tipo funciona bien, la búsqueda binaria da un error de compilación No se puede convertir la expresión lambda para escribir 'System.Collections.IComparer <Widget>' porque no es un tipo de delegado. Por alguna razón, Sort tiene sobrecargas tanto para IComparer como para comparación, pero BinarySearch solo es compatible con IComparer. Después de algunas investigaciones, descubrí la torpe ComparisonComparer<T>
para convertir la comparación con un 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);
}
}
Esto permite que la búsqueda binaria para trabajar de la siguiente manera:
int index = Array.BinarySearch(
widgets,
x,
new ComparisonComparer<Widget>((a, b) => a.foo.CompareTo(b.foo)));
Yuck. ¿Hay una manera más limpia?
La próxima .NET4.5 tiene un método 'Comparer <> create' para la construcción de una' IComparer <>. 'instancia de un delegado' IComparison <> '. –