2008-10-30 14 views
9

में सूची न्यूनतम/अधिकतम गणना करने के लिए मैं की तरहसबसे छोटा कोड नेट

int minIndex = list.FindMin(delegate (MyClass a, MyClass b) {returns a.CompareTo(b);}); 

कुछ करना चाहते हैं वहाँ .NET में यह करने के लिए अंतर्निहित तरीका है?

+4

लघु कोड मेरे लिए एक मीट्रिक नहीं है। अपना कोड यथासंभव स्पष्ट और पठनीय बनाएं। आप प्रति पंक्ति का भुगतान नहीं करते हैं;)। – Tigraine

उत्तर

18

इन में देखने का प्रयास:

Min

Max

जब तक आपके वर्ग को लागू करता है IComparable, तुम सब करने की ज़रूरत है:

List<MyClass> list = new List(); 
//add whatever you need to add 

MyClass min = list.Min(); 
MyClass max = list.Max(); 
+0

.NET 3.5 मुझे लगता है। मैं अभी भी 2 में हूं, इन्हें अस्तित्व में भी नहीं पता था। – ripper234

+2

यदि आप अभी भी .NET 2.0 में हैं, तो यह आपका स्वीकार्य उत्तर कैसे हो सकता है? –

+3

क्योंकि यह एक अच्छा है (मुझे बस 3.5 पर जाना चाहिए :) – ripper234

3

LINQ का उपयोग कर आप न्यूनतम() और अधिकतम() फ़ंक्शन।

तो आपको लगता है कि "मैं 2 में अब भी कर रहा हूँ" list.AsQueryable().Min();

+0

माइनर: AsQueryable() के लिए कोई आवश्यकता नहीं है ... –

+0

मुझे पता नहीं था कि सूची <> न्यूनतम और अधिकतम कार्य था। आप यहां हर दिन कुछ नया सीखते हैं! :-) –

2

आप ध्यान दें कर सकते हैं - आप, तो, LINQBridge को देखने के लिए चाहते हो सकता है। यह वास्तव में सी # 3.0 और .NET 2.0 के उद्देश्य से है, लेकिन आप के साथ उपयोग करने में सक्षम होना चाहिए सी # 2.0 और .NET 2.0 - ठीक वैसे ही लंबे समय से हाथ का उपयोग करना होगा:

MyClass min = Enumerable.Min(list), 
     max = Enumerable.Max(list); 
बेशक

, यदि आप सी # 3.0 (अभी भी .NET 2.0 को लक्षित कर रहे हैं) पर स्विच कर सकते हैं तो यह आसान होगा।

और अगर LINQBridge एक विकल्प नहीं है, तो आप इसे अपने आप को लागू कर सकते हैं:

static void Main() 
{ 
    int[] data = { 3, 5, 1, 5, 5 }; 
    int min = Min(data); 
} 
static T Min<T>(IEnumerable<T> values) 
{ 
    return Min<T>(values, Comparer<T>.Default); 
} 
static T Min<T>(IEnumerable<T> values, IComparer<T> comparer) 
{ 
    bool first = true; 
    T result = default(T); 
    foreach(T value in values) { 
     if(first) 
     { 
      result = value; 
      first = false; 
     } 
     else 
     { 
      if(comparer.Compare(result, value) > 0) 
      { 
       result = value; 
      } 
     } 
    } 
    return result; 
} 
+0

मैंने इसे कार्यान्वित कर दिया - मेरा मानना ​​है कि मेरा कोड बिल्कुल आपके स्निपेट की तरह है। क्या आपने इसे अपने स्रोत नियंत्रण से लिया था? :) – ripper234

10

ठीक है, यदि आप .NET 3.5 उपयोग नहीं कर सकते, तो आप हमेशा सूची को सॉर्ट और फिर लौट सूची [0 सकता है ]। यह सबसे तेज़ तरीका नहीं हो सकता है, लेकिन शायद यह सबसे छोटा कोड है, खासकर यदि आपकी कक्षा पहले ही आईसीओपरपेबल लागू करती है।

List<SomeClass> list = new List<SomeClass>(); 
// populate the list 
// assume that SomeClass implements IComparable 
list.Sort(); 
return list[0];    // min, or 
return list[list.Count - 1]; // max 

यह भी निश्चित रूप से मान लिया गया है, यह कोई बात नहीं है कि जो आइटम आप अगर आप एक से अधिक आइटम है कि न्यूनतम या अधिकतम रहे हैं वापस जाएँ।

अपनी कक्षा IComparable को लागू नहीं करता है, तो आप एक अनाम प्रतिनिधि में कुछ इस तरह पारित कर सकते हैं,:

list.Sort(delegate(SomeClass x, SomeClass y) { return string.Compare(x.Name, y.Name); }); 
+0

मैं सहमत हूं, मुझे यह पसंद है ... विशेष रूप से यह तथ्य है कि वह 2.0 में है। Upvoted! – Ken

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