2009-06-25 17 views
50

का उपयोग कर मैं एक LINQ नौसिखिया हूँ इसका इस्तेमाल करने की कोशिश कर रहा से एक प्रदान की सूचकांक सीमा के भीतर मान चुनने के लिए कैसे निम्नलिखित हासिल करने के लिए:एक सूची LINQ

मैं ints की एक सूची है: -

List<int> intList = new List<int>(new int[]{1,2,3,3,2,1}); 

अब, मैं LINQ का उपयोग कर पिछले तीन [इंडेक्स रेंज 3-5] के साथ पहले तीन तत्वों [इंडेक्स रेंज 0-2] के योग की तुलना करना चाहता हूं। मैं LINQ का चयन करने की कोशिश की और विस्तार के तरीकों के साथ-साथ SelectMany विधि ले लो, लेकिन मैं समझ नहीं की तरह कुछ

(from p in intList 
where p in Take contiguous elements of intList from index x to x+n 
select p).sum() 

मैंने देखा भी विस्तार विधि शामिल में कैसे कहने के लिए है, लेकिन वह पाने के लिए नहीं देखा है मैं क्या चाहता हूँ कोई सुझाव? धन्यवाद।

उत्तर

77

Skip का उपयोग करें, फिर ले लो।

yourEnumerable.Skip(4).Take(3).Select(x=>x) 

(from p in intList.Skip(x).Take(n) select p).sum() 
+6

ध्यान दें कि सूची .GetRange बड़ा संग्रह के लिए हालांकि अधिक योग्य होंगे: https: // icodeit। wordpress.com/2012/08/27/performance-of-skip-and-take-in-linq-to-objects/, http://geekswithblogs.net/BlackRabbitCoder/archive/2012/03/29/c.net -लिटल-चमत्कार-वगैरह-और-टेक.एएसपी – nawfal

+0

यह एक अच्छी, वैध, टिप्पणी है (इसलिए कुछ साल पहले वैध मैंने नीचे दिए गए उत्तर लेखक को ऊपर उठाया था), हालांकि ओपी ने विशेष रूप से LINQ के बारे में पूछा था आप फिर से नहीं कर सकते y आपके स्रोत के रूप में एक सूची की गारंटी देता है। यह प्रश्न में वास्तविक समस्या का सरलीकृत संस्करण हो सकता है, जहां सरलीकृत संस्करण केवल हार्ड कोड कोड (और वास्तव में किसी ऑब्जेक्ट ग्राफ़ या LINQ से SQL क्वेरी पर एक क्वेरी हो सकता है) हो सकता है। –

15

बड़ी सूचियों के लिए, प्रदर्शन के लिए एक अलग एक्सटेंशन विधि अधिक उपयुक्त हो सकती है। मुझे पता है कि प्रारंभिक मामले के लिए यह जरूरी नहीं है, लेकिन लिंक (ऑब्जेक्ट्स) कार्यान्वयन सूची को फिर से चालू करने पर निर्भर करता है, इसलिए बड़ी सूचियों के लिए यह महंगा (व्यर्थ रूप से) महंगा हो सकता है। एक सरल विस्तार विधि प्राप्त करने के लिए इस हो सकता है:

public static IEnumerable<TSource> IndexRange<TSource>(
    this IList<TSource> source, 
    int fromIndex, 
    int toIndex) 
{ 
    int currIndex = fromIndex; 
    while (currIndex <= toIndex) 
    { 
     yield return source[currIndex]; 
     currIndex++; 
    } 
} 
+0

धन्यवाद, आपने मेरा दिन बनाया! –

26

आप GetRange उपयोग कर सकते हैं()

list.GetRange(index, count); 
+1

यह फ़ंक्शन कहां है? .NET 4.5 या कुछ? –

+4

@AdamNofsinger यह सिस्टम के तहत है। चयन। जेनेरिक नेमस्पेस। यह नेट 2.0 के साथ आया था। http://msdn.microsoft.com/en-us/library/21k0e39c(v=vs.80).aspx – Onuralp

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