Tôi đang sử dụng biểu thức lambda để sắp xếp và tìm kiếm một mảng trong C#. Tôi không muốn thực hiện giao diện IComparer trong lớp của mình, vì tôi cần sắp xếp và tìm kiếm trên nhiều trường thành viên.C# biểu thức lambda và 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));
}
}
Trong khi các loại hoạt động tốt, việc tìm kiếm nhị phân đưa ra một lỗi biên dịch Không thể chuyển đổi biểu thức lambda để gõ 'System.Collections.IComparer <Widget>' vì nó không phải là một loại đại biểu. Vì một số lý do, sắp xếp có quá tải cho cả IComparer và So sánh, nhưng BinarySearch chỉ hỗ trợ IComparer. Sau khi một số nghiên cứu, tôi đã khám phá ra clunky ComparisonComparer<T>
để chuyển đổi So sánh với một 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);
}
}
Điều này cho phép tìm kiếm nhị phân để làm việc như sau:
int index = Array.BinarySearch(
widgets,
x,
new ComparisonComparer<Widget>((a, b) => a.foo.CompareTo(b.foo)));
Yuck. Có cách nào sạch hơn không?
Các .NET4.5 sắp tới có một phương pháp 'Comparer <> Create' cho xây dựng một' IComparer <>. 'instance từ một đại biểu' IComparison <> '. –