Używam wyrażeń lambda do sortowania i wyszukiwania tablicy w języku C#. Nie chcę implementować interfejsu IComparer w mojej klasie, ponieważ muszę sortować i przeszukiwać wiele pól elementów.C# wyrażeń lambda i 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));
}
}
Podczas sortowania działa prawidłowo, wyszukiwanie binarne daje błąd kompilacji nie można przekonwertować wyrażenia lambda wpisać „System.Collections.IComparer <widget>”, ponieważ nie jest to typ delegata. Z jakiegoś powodu Sort ma przeciążenia zarówno dla programu IComparer, jak i dla porównania, ale BinarySearch obsługuje tylko program IComparer. Po kilku badań odkryłem przylegający ComparisonComparer<T>
przekonwertować porównanie do 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);
}
}
Umożliwia wyszukiwanie binarne do pracy w następujący sposób:
int index = Array.BinarySearch(
widgets,
x,
new ComparisonComparer<Widget>((a, b) => a.foo.CompareTo(b.foo)));
fuj. Czy istnieje czystszy sposób?
Nadchodzący .NET4.5 ma metodę 'porównywarka <> Create' do konstruowania' IComparer <>. 'wystąpienie z delegata' IComparison <>. –