2009-07-23 12 views
11

मैं पूर्णांकों का निम्न सरणी हैLINQ का उपयोग कर एक int सरणी में शीर्ष 3 तत्व कैसे प्राप्त करें?

var topThree = (from i in array orderby i descending select i).Take(3); 

जब मैं जाँच क्या topThree अंदर है, मुझे लगता है:

int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 }; 

मैं निम्नलिखित कोड सरणी में शीर्ष 3 तत्वों प्राप्त करने के लिए लिखा है:

{System.Linq.Enumerable.TakeIterator}
गिनती: 0

मैंने क्या गलत किया और मैं अपना कोड कैसे सही कर सकता हूं?

+4

शीर्ष में वस्तु * परिणाम * नहीं है, यह * क्वेरी * है। शीर्ष तीन एक वस्तु है जिसका अर्थ है "सरणी में वस्तुओं के अनुक्रम को उच्चतम से निम्नतम तक क्रमबद्ध करें और पहले तीन को लें"। यह सब * इसका मतलब है। इसका मतलब यह नहीं है "8, 6, 5"। इसका मतलब है * क्वेरी *, न कि * परिणाम *। आप क्वेरी को निष्पादित करके, फिर सरणी को बदलकर और फिर क्वेरी को निष्पादित करके इसे प्रदर्शित कर सकते हैं। क्वेरी बिल्कुल वही है लेकिन परिणाम अलग हैं। –

उत्तर

23

आपने "शीर्ष के अंदर क्या है" की जांच कैसे की? ऐसा करने के लिए सबसे आसान तरीका उन्हें प्रिंट करना है:

using System; 
using System.Linq; 

public class Test 
{ 
    static void Main()   
    { 
     int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 }; 
     var topThree = (from i in array 
         orderby i descending 
         select i).Take(3); 

     foreach (var x in topThree) 
     { 
      Console.WriteLine(x); 
     } 
    } 
} 

मुझे ठीक लग रहा है ...

वहाँ संभावित छँटाई से शीर्ष N मान ढूँढने के लिए अधिक कुशल तरीके हैं, लेकिन यह निश्चित रूप से काम करेंगे । आप एक प्रश्न जो केवल एक ही काम करता है के लिए डॉट अंकन का उपयोग पर विचार करना चाहते हो सकता है:

var topThree = array.OrderByDescending(i => i) 
        .Take(3); 
+0

मैंने इसे क्विकवॉच में चेक किया। चीजों को और स्पष्ट करने के लिए धन्यवाद। –

+2

क्विकवॉच शायद रूढ़िवादी है, आपके लिए कोड निष्पादित न करने का प्रयास कर रहा है जबतक कि आप वास्तव में इसे नहीं पूछते। क्वेरी में वास्तव में डेटा नहीं होता है - यह केवल डेटा को प्राप्त करने के बारे में जानता है। डेटा प्राप्त करना धीमा हो सकता है, या साइड इफेक्ट्स हो सकता है, इसलिए डिफ़ॉल्ट रूप से डेटा को डीबगर में दिखाने का बुरा विचार है। –

+0

"सॉर्टिंग से शीर्ष एन मानों को खोजने के संभावित रूप से अधिक प्रभावी तरीके हैं" - क्या आप एक और अधिक कुशल विधि का उदाहरण प्रदान कर सकते हैं? –

11

आपका कोड मेरे लिए ठीक लग रहा है, तो आप शायद परिणाम वापस एक और सरणी के लिए प्राप्त करना चाहते हैं?

int[] topThree = array.OrderByDescending(i=> i) 
         .Take(3) 
         .ToArray(); 
3

यह linq क्वेरी के देरी निष्पादन के कारण है।

जैसा कि आप जोड़ते हैं, सुझाव दिया गया है। ToArray() या .ToList() या इसी तरह आपको सही परिणाम मिल जाएगा।

-1
int[] intArray = new int[7] { 1, 3, 5, 2, 8, 6, 4 };    
int ind=0; 
var listTop3 = intArray.OrderByDescending(a=>a).Select(itm => new { 
    count = ++ind, value = itm 
}).Where(itm => itm.count < 4); 
संबंधित मुद्दे