LINQ

2010-11-02 5 views
29
var item = list.Where(t => somecondition); 

का उपयोग कर किसी शर्त से मेल खाने वाले तत्व की पहली अनुक्रमणिका ढूंढना मुझे वापस आने वाले तत्व की अनुक्रमणिका को खोजने में सक्षम होना पसंद है, असल में, मेरे मामले में, मैं चाहता हूं कि मैं एक इंडेक्स चाहता हूं, ताकि मैं सूची में .kip() कर सकते हैं।LINQ

क्या यह एक आईनेमरेबल में ऐसा करने का कोई तरीका है? मैं इस के लिए एक List<T> उपयोग करने के लिए नफरत करता हूँ, लेकिन यह एक FindIndex() विधि है

उत्तर

22

मैं अधिक संदर्भ आवश्यकता होगी, लेकिन अगर आप सिर्फ इतना है कि आप .Skip कॉल कर सकते हैं एक सूची हो रही है, मैं .SkipWhile पर एक नज़र लेने की सलाह देते हैं ।

यदि आपको वास्तव में इंडेक्स की आवश्यकता है, तो मैं आपको अपना खुद का .IndexOf एक्सटेंशन विधि लिखने का सुझाव दूंगा।

+0

+1 यह उल्लेख करने के लिए कि वह शायद 'SkipWhile' का उपयोग करना चाहता है, क्योंकि इंडेक्स ढूंढना और फिर' Skip' को कॉल करना क्वेरी को दो बार – Gabe

+0

बताता है तो बंद करें ... अब मैं एक काउंटर, यानी सूची के साथ संयोजन के दौरान SkipWhile का उपयोग करना चाहता हूं। SkipWhile (myBusinessLogicCondition && list.Count - SkipIndex> someXnumber); – user494352

+0

उपयोगकर्ता 4 9 4352: ऐसा लगता है कि आप जॉन की सूची देखना चाहते हैं। चयन करें()। SkipWhile() 'अपने पोस्ट के अंत में जवाब दें। – Gabe

6

आप पहली बार अपने सूचकांक सूची आइटम पेश कर सकती हैं:

var item = list.Select((item, index) => new { Item = item, Index = index }) 
       .Where(pair => SomeCondition(pair.Item)) 
       .Select(result => result.Index); 
36

ज़रूर, यह बहुत आसान है:

var index = list.Select((value, index) => new { value, index = index + 1 }) 
       .Where(pair => SomeCondition(pair.value)) 
       .Select(pair => pair.index) 
       .FirstOrDefault() - 1; 

अगर यह कुछ भी मिल रहा है, या अन्यथा सूचकांक वापस करेगा। +1 और -1 उस मामले के लिए व्यवहार प्राप्त करना है जहां कोई मिलान नहीं है। यदि आप पता था कि वहाँ हमेशा एक मैच होगा, यह आसान हो जाएगा:

var index = list.Select((value, index) => new { value, index }) 
       .Where(pair => SomeCondition(pair.value)) 
       .Select(pair => pair.index) 
       .FirstOrDefault(); 

आप उस बिंदु से सूची के बाकी प्राप्त करने के लिए खुश हैं, तो निश्चित रूप से SkipWhile अपने दोस्त, के रूप में क्रिस ने उल्लेख किया है । यदि सूची के बाकी और मूल सूचकांक चाहते हैं, इतना आसान भी है:

var query = list.Select((value, index) => new { value, index }) 
       .SkipWhile(pair => !SomeCondition(pair.value)) 

है कि आप SomeCondition मिलान पहले मूल्य से { value, index } जोड़े का एक अनुक्रम दे देंगे।

+1

यह एक शर्म की बात है 'FirstOrDefault' आप डिफ़ॉल्ट, हुह स्पष्ट करने देते हैं यह नहीं है कि क्या है? – Gabe

+0

@Gabe: Yes :(मान लीजिए कि यह आपके स्वयं के कार्यान्वयन को लिखना आसान होगा ... –

+0

धन्यवाद जॉन, मैं इंडेक्स के साथ SkipWhile को शामिल करने की कोशिश कर रहा हूं, बल्कि यह देखने के लिए गिनती हूं कि मैंने बहुत अधिक छोड़ दिया है। – user494352

14
IEnumerable का उपयोग कर इसके संभावित बेशक

...

public static class EnumerableExtension 
    { 

     public static int FirstIndexMatch<TItem>(this IEnumerable<TItem> items, Func<TItem,bool> matchCondition) 
     { 
      var index = 0; 
      foreach (var item in items) 
      { 
       if(matchCondition.Invoke(item)) 
       { 
        return index; 
       } 
       index++; 
      } 
      return -1; 
     } 
    } 
+1

+1। मैं आमतौर पर जॉन की तरह अधिक linq-y उत्तरों पसंद करता हूं, लेकिन इस मामले में यह समाधान देखने और समझने के लिए इतना आसान है कि यह क्या करता है। और एक विस्तार विधि के रूप में यह अभी भी एक linq अभिव्यक्ति में * इस्तेमाल * किया जा सकता है। फायदे का सौदा। –

+0

'matchCondition.Invoke (आइटम) 'का उपयोग करना आवश्यक नहीं है। आप बस 'मैच कंडीशन (आइटम)' कर सकते हैं। – ErikE

24

तुम सच में सिर्फ पहला सूचकांक की जरूरत है तो लोगों को है कि मेल नहीं गिनती:

var index = list.TakeWhile(t => !someCondition).Count() 
संबंधित मुद्दे

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