2010-08-25 11 views

उत्तर

23

बस इसे अपने आप को लगा बाहर ...

IEnumerable<T>.Where() विधि एक अधिभार है कि वर्तमान तत्व के सूचकांक लेता है - बस क्या डॉक्टर का आदेश दिया।

(new []{1,2,3,4,5}).Where((elem, idx) => idx % 2 == 0); 

यह वापसी होगी

{1, 3, 5} 

अद्यतन: आदेश दोनों मेरे उपयोग के मामले और दान ताओ के सुझाव को कवर करने के लिए, के भी स्पष्ट करने देते हैं क्या पहले लौट आए तत्व होना चाहिए:

var firstIdx = 1; 
var takeEvery = 2; 
var list = new []{1,2,3,4,5}; 

var newList = list 
    .Skip(firstIdx) 
    .Where((elem, idx) => idx % takeEvery == 0); 

...

{2, 4} 
+2

पहली बार मैंने संग्रह संग्रह में सूचकांक के लिए वास्तव में ठोस उपयोग देखा है, ब्रावो, मैंने इसे नहीं सोचा होगा। –

+0

आप एक एक्सटेंशन विधि को परिभाषित कर सकते हैं जो इसे देता है। जहां (...) अपने ऐप में यह स्पष्ट करने के लिए। – Douglas

+5

मैं "हर एनएच तत्व" के विवरण से मेल खाने के लिए 'idx + 1' का उपयोग करने का सुझाव दे सकता हूं; कम से कम मेरे लिए, यह सुझाव देता है कि लौटा पहला तत्व एनएच तत्व होना चाहिए। तो '{1,2,3,4,5}' - * * * में हर दूसरे तत्व का अर्थ है '{2,4}' (आपका कोड '{1,3,5}') लौटाता है। शायद यह व्यक्तिपरक है, यद्यपि। –

8

Cristi's suggestion को लागू करने के लिए:

public static IEnumerable<T> Sample<T>(this IEnumerable<T> source, int interval) 
{ 
    // null check, out of range check go here 

    return source.Where((value, index) => (index + 1) % interval == 0); 
} 

उपयोग:

var upToTen = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

var evens = upToTen.Sample(2); 
var multiplesOfThree = upToTen.Sample(3); 
+0

आप सरणी को भी छोड़ सकते हैं और 'एन्यूमेरेबल। रेंज (1,10)' का उपयोग कर सकते हैं। –

+2

@ एंथनी: यह सिर्फ एक उदाहरण है, जिसका उद्देश्य तत्काल समझ के लिए है। मुझे पता है कि कुछ डेवलपर्स को 'एन्यूमेरेबल। रेंज' देखना होगा। –

0

आप भी yield साथ एक विस्तार विधि बना सकते हैं LINQ नहीं है।

public static IEnumerable<T> EverySecondObject<T>(this IEnumerable<T> list) 
{ 
    using (var enumerator = list.GetEnumerator()) 
    { 
     while (true) 
     { 
      if (!enumerator.MoveNext()) 
       yield break; 
      if (enumerator.MoveNext()) 
       yield return enumerator.Current; 
      else 
       yield break; 
     } 
    } 
} 
+2

लपेटें कि 'उपयोग' में! ('IENumerable' विरासत' IDISposable'।) –

+0

@Dan: आपका मतलब IENumerator है। मैं पहले कभी यह कैसे महसूस नहीं किया? <कुछ पुराने कोड /> –

+0

के माध्यम से खुदाई हां, मेरा मतलब था 'आईन्यूमेरेटर'। ओह! (किसी कारण से मैं हमेशा एक टाइप करता हूं जब मेरा मतलब दूसरे को टाइप करना होता है। मांसपेशियों की याददाश्त होना चाहिए।) –

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