2012-07-04 8 views
12

मैं एक Linq MinBy विस्तार विधियदि चर सौंपा

public static class Extensions 
{ 
    public static T MinBy<T>(this IEnumerable<T> source, Func<T,int> selector) 
    { 
     T min; 
     int? minKey = null; 
     foreach (var x in source) 
     { 
      var key = selector(x); 
      if (minKey == null || key < minKey) 
      { 
       minKey = key; 
       min = x; 
      } 
     } 
     if (minKey == null) 
     { 
      throw new ArgumentException("source should not be empty"); 
     } 
     return min; 
    } 
} 

मुझे लगता है कि मेरी तर्क सही और पठनीय है कोड करने के लिए कोशिश कर रहा हूँ सी # परीक्षण। लेकिन मैं एक निर्माण त्रुटि असाइन नहीं किए गए स्थानीय चर 'मिनट'

मैं इस बारे में क्या कर सकते हैं की

उपयोग मिल सकता है? यदि चर आवंटित किया गया है तो क्या मैं परीक्षण कर सकता हूं?


स्पष्टीकरण: एक मिनीबी फ़ंक्शन निम्न प्रश्न का उत्तर दे सकता है। किस संख्या में [-5, -2, 3] का सबसे छोटा वर्ग है?

> new List<int>{-5,-2,3}.MinBy(x => x*x) 
-2 

नेट के न्यूनतम समारोह एक अलग प्रश्न (जो वर्गों में सबसे छोटी है)

> new List<int>{-5,-2,3}.Min(x => x*x) 
4 
+0

IQueryable <> इसके लिए IENumerable <> imho से भी बेहतर होगा। – Alex

+0

IQueryable क्या है? –

+0

इसे एमएसडीएन पर देखें, यह एक प्रकार का संग्रह है जो क्वेरी चेनिंग को बहुत शक्तिशाली बनाता है। – Alex

उत्तर

23

आप इस तरह min लिए एक डिफ़ॉल्ट मान की जरूरत है जवाब देता है:

T min = default(T);

You can read more about default() on MSDN:

पैरामीटरयुक्त प्रकार टी के एक चर टी को देखते हुए, कथन टी = शून्य केवल तभी वैध है जब टी संदर्भ प्रकार है और टी = 0 केवल संख्यात्मक मान प्रकारों के लिए काम करेगा लेकिन structs के लिए नहीं। समाधान डिफ़ॉल्ट कीवर्ड का उपयोग करना है, जो संख्यात्मक मान प्रकारों के लिए संदर्भ प्रकारों और शून्य के लिए शून्य लौटाएगा। Structs के लिए, यह के प्रत्येक सदस्य को शून्य या शून्य पर प्रारंभ की गई संरचना के आधार पर वापस करेगा, चाहे वे मान या संदर्भ प्रकार हैं। शून्य मूल्य प्रकारों के लिए, डिफ़ॉल्ट सिस्टम देता है। अनुपयोगी, जिसे किसी भी संरचना की तरह प्रारंभ किया जाता है।

+0

धन्यवाद। क्या यह मेरा तर्क तोड़ता है? थोड़ा सोचा के बाद, नहीं। –

1

ऐसा इसलिए है क्योंकि न्यूनतम स्थिति को अंदर रखा गया है। कंपाइलर यह निर्धारित नहीं कर सकता कि उसे कोई मूल्य मिलेगा या नहीं, आपको default मान के साथ मिनट प्रारंभ करना चाहिए।

4

min लिए एक डिफ़ॉल्ट मान जोड़ें:

T min = default(T); 

कारण यह शिकायत है संकलक सत्यापित नहीं कर सकता है कि उस min एक मूल्य सौंपा गया है इससे पहले कि यह return min; लाइन में प्रयोग किया जाता है है। एक असाइन किए गए स्थानीय चर का संदर्भ नहीं दिया जा सकता है, और इसलिए संकलक एक त्रुटि उत्पन्न करता है।

-1

FYI करें यह है कि क्या मैं

public static T MinBy<T>(this IEnumerable<T> source, Func<T,int> selector) 
    { 
     T min = default(T); 
     bool started = false; 
     int minKey = default(int); 
     foreach (var x in source) 
     { 
      var key = selector(x); 
      if (!started || key < minKey) 
      { 
       minKey = key; 
       min = x; 
       started = true; 
      } 
     } 
     if (!started) 
     { 
      throw new ArgumentException("source should not be empty","source"); 
     } 
     return min; 
    } 
-1

नहीं साथ समाप्त हो गया है, तो आप परीक्षण नहीं कर सकते हैं कि क्या एक चर असाइन किया गया है, तो आप हमेशा एक संकलन त्रुटि मिल जाएगा।

संबंधित मुद्दे