मैं सी # में सरणी को सॉर्ट और खोजने के लिए लैम्ब्डा एक्सप्रेशन का उपयोग कर रहा हूं। मैं अपनी कक्षा में आईसीओएमपेयर इंटरफेस को लागू नहीं करना चाहता, क्योंकि मुझे कई सदस्य फ़ील्ड को सॉर्ट और खोजना होगा।सी # लैम्ब्डा एक्सप्रेशन और आईसीओएमपेयर
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));
}
}
तरह ठीक काम करता है, वहीं द्विआधारी खोज एक संकलन त्रुटि टाइप करने के लिए 'System.Collections.IComparer < विजेट >' क्योंकि यह एक प्रतिनिधि प्रकार नहीं है लैम्ब्डा अभिव्यक्ति कनवर्ट नहीं कर सकता देता है। किसी कारण से, सॉर्ट में आईसीओम्पियर और तुलना दोनों के लिए अधिभार है, लेकिन बाइनरीशर्च केवल आईसीओएमपेयर का समर्थन करता है। कुछ शोध के बाद, मैं एक IComparer से तुलना कन्वर्ट करने के लिए भद्दा ComparisonComparer<T>
की खोज:
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);
}
}
यह अनुमति देता है द्विआधारी खोज के रूप में निम्नानुसार काम करने के लिए:
int index = Array.BinarySearch(
widgets,
x,
new ComparisonComparer<Widget>((a, b) => a.foo.CompareTo(b.foo)));
नीरस। क्या कोई क्लीनर तरीका है?
आगामी .NET4.5 एक विधि 'comparer <> एक' IComparer के निर्माण के लिए Create' <> है '' IComparison <> 'प्रतिनिधि से उदाहरण। –