2010-07-08 13 views
7

के साथ एक सूची से अंतिम एक्स रिकॉर्ड कैसे प्राप्त करें मेरे पास स्ट्रिंग्स की सूची है जहां मैं प्रत्येक डुप्लीकेट को हटाता हूं, अब मैं पिछले 5 रिकॉर्ड प्राप्त करने के लिए इसे और भी फ़िल्टर करना चाहता हूं। मैं यह कैसे कर सकता हूँ?लैम्ब्डा

मैं अब तक

List<string> query = otherlist.Distinct().Select(a => a).ToList(); 
+0

क्यों 'चुनें (एक => एक)'? यह कुछ भी नहीं करता है ... – tzaman

+0

जो कि आखिरी एक्स रिकॉर्ड फ़िल्टर – Ivo

उत्तर

9

आपको .Select(a => a) की आवश्यकता नहीं है। अनावश्यक चीजें।

आप पिछले 5 रिकॉर्ड, जैसे

List<string> query = otherlist.Distinct().ToList(); 
List<string> lastFive = query.Skip(query.Count-5).ToList(); 
+0

छोड़ें() रिवर्स() के बाद बेहतर प्रदर्शन है(), स्पष्ट रूप से ले लो। –

+0

@ डैनी: जितना आप सोचेंगे उतना नहीं: 'टोलिस्ट()' कॉल मेरी पहली 'रिवर्स() '(एक बार पूरी सूची को पार करने) के रूप में महंगा होगा, और' टेक (5)' यह सिर्फ पांच तत्वों को उलट रहा है जो मूंगफली हैं। इसके अलावा, मेरा तरीका मध्यवर्ती सूची नहीं बनाता है। – tzaman

+0

@ टाज़मान - "मेरा तरीका मध्यवर्ती सूची नहीं बनाता है" - हाँ यह करता है; वास्तव में उनमें से दो। आपको लगता है कि 'रिवर्स' कैसे काम करता है? (अच्छी तरह से, सख्ती से यह एक 'टी []' सरणी बनाता है, 'बफर 'की सौजन्य - लेकिन एक ही अंतर) –

4

यह कैसे के बारे में क्या है?

var lastFive = list.Reverse().Take(5).Reverse(); 

संपादित करें: यहाँ पूरी बात है -

var lastFiveDistinct = otherlist.Distinct() 
           .Reverse() 
           .Take(5) 
           .Reverse() 
           .ToList(); 

भी ध्यान रखें कि आप इसे नहीं बुलाना चाहिए query आप अंत में एक ToList() कॉल मिल गया है अगर, क्योंकि तब यह एक नहीं है अब और पूछताछ करें, इसका मूल्यांकन किया गया है और एक सूची में बदल गया है। यदि आपको केवल इसे फिर से शुरू करने की आवश्यकता है, तो आप ToList() कॉल को छोड़ सकते हैं और इसे IEnumerable के रूप में छोड़ सकते हैं।

+1

डालने के लिए मेरा "डमी" था, मैं उद्यम करता हूं कि तत्वों की गणना करना सस्ता होगा और फिर छोड़ें और ले जाएं। एक आईनेमरेबल को उलटना सस्ता नहीं हो सकता है। – spender

+0

यह वही एसिम्प्टोटिक जटिलता है, लेकिन आप सही हैं कि छोड़ें/लेना शायद तेज़ है। – tzaman

+0

असल में, मैं अपने पहले के बयान में संशोधन करूंगा - मुझे नहीं लगता कि एक उल्लेखनीय प्रदर्शन अंतर होगा। जेन्स के जवाब पर मेरी टिप्पणी देखें। – tzaman

0
var count=list.Count(); 
var last5=list.Skip(count-5); 

संपादित बाकी हिस्सों में लंघन द्वारा प्राप्त कर सकते हैं:

मैं याद किया है कि डेटा सूची < टी> है। यह दृष्टिकोण IEnumerable < टी>

5

संपादित के लिए बेहतर हो गैर सूची आदानों के लिए पूरा करने के लिए, अब IEnumerable<T> और चेकों संभालती है अगर यह एक IList<T> है होगा, यदि नहीं, तो यह ToList() के माध्यम से बफर करता है, जो यह सुनिश्चित करने में सहायता करता है कि हम केवल डेटा (.Count() और .Skip() के बजाय डेटा को पढ़ सकते हैं) जो डेटा को कई बार पढ़ सकता है)।

चूंकि यह एक सूची है, मैं एक विस्तार विधि लिखने के लिए इच्छुक हो जाएगा कि पूरा करने के लिए है कि का उपयोग करता है:

public static IEnumerable<T> TakeLast<T>(
      this IEnumerable<T> source, int count) 
    { 
     IList<T> list = (source as IList<T>) ?? source.ToList(); 
     count = Math.Min(count, list.Count); 
     for (int i = list.Count - count; i < list.Count; i++) 
     { 
      yield return list[i]; 
     } 
    } 
+0

बिल्कुल। यह देखते हुए कि यह एक सूची है, यह एक सरल और आसानी से सबसे कुशल दृष्टिकोण है। – Noldorin

+0

सिवाय इसके कि जब यह 'विशिष्ट()' कॉल से बाहर आता है तो यह एक सूची नहीं होगी; 'ToList() 'को अंत में एक बार होने की आवश्यकता है। – tzaman

+0

@ टाज़मान - ठीक है; संपादित करेंगे –

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