KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I am using lambda expressions to sort and search an array in C#. I don't want to implement the IComparer interface in my class, because I need to sort and search on multiple member fields. 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)); } } While the sort works fine, the binary search gives a compilation error Cannot convert lambda expression to type 'System.Collections.IComparer<Widget>' because it is not a delegate type . For some reason, Sort has overloads for both IComparer and Comparison, but BinarySearch only supports IComparer. After some research, I discovered the clunky ComparisonComparer<T> to convert the Comparison to an 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); } } This allows the binary search to work as follows: int index = Array.BinarySearch( widgets, x, new ComparisonComparer<Widget>((a, b) => a.foo.CompareTo(b.foo))); Yuck. Is there a cleaner way?
Tags (comma-separated)
Save Edits
Cancel