2012-08-09 18 views
14

मैं LINQ TakeWhile फ़ंक्शन LINQ से ऑब्जेक्ट्स का उपयोग करना चाहता हूं। हालांकि, मुझे पहले तत्व को जानने की जरूरत है जो फ़ंक्शन को "तोड़ दिया", यानी पहला तत्व जहां स्थिति सत्य नहीं थी।TakeWhile, लेकिन उस तत्व को प्राप्त करें जो इसे रोकता है

क्या उन सभी वस्तुओं को प्राप्त करने के लिए एक ही कार्य है जो मेल नहीं खाते हैं, साथ ही पहले ऐसा करता है?

उदाहरण के लिए, सेट {1,2,3,4,5,6,7,8} दिया,

mySet.MagicTakeWhile(x => x != 5); 

=> {1,2,3,4,5}

+0

आप है कि आसानी से की तरह एक विधि लिख सकते हैं, लेकिन यह "सुस्त" के बाद से आप अगले एक पाने के लिए में अंतिम आइटम की स्थिति को पता होना चाहिए नहीं होगा। –

+0

[यह प्रश्न] (https://stackoverflow.com/q/2242318/241211) काफी डुप्लिकेट नहीं है, लेकिन शेयर [एक उत्तर।] (Https://stackoverflow.com/a/6817553/241211) – Michael

उत्तर

9

मुझे लगता है कि आप SkipWhile उपयोग कर सकते हैं, और फिर पहला तत्व ले लो।

var elementThatBrokeIt = data.SkipWhile(x => x.SomeThing).Take(1); 

अद्यतन

आप एक ही विस्तार विधि चाहते हैं, आप निम्न का उपयोग कर सकते हैं:

public static IEnumerable<T> MagicTakeWhile<T>(this IEnumerable<T> data, Func<T, bool> predicate) { 
    foreach (var item in data) { 
     yield return item; 
     if (!predicate(item)) 
      break; 
    } 
} 
+1

वह एकाधिक कॉल की आवश्यकता होगी। मैं उस मामले में बस 'फर्स्टऑर्ड डीफॉल्ट' कर सकता था। –

+0

+1 कार्य कोड प्रदान करने के लिए – Gabe

+0

@ मार्टन, अच्छा जवाब - आप अंतिम 'उपज ब्रेक को हटाकर एक लाइन को बचा सकते हैं;' – allonhadaya

6

वस्तुओं के लिए LINQ इस तरह के एक ऑपरेटर भी नहीं है। लेकिन यह TakeUntil एक्सटेंशन को स्वयं लागू करने के लिए सरल है। moreLinq से यहां है।

+0

दुर्भाग्य से वे इसे MoreLinq NuGet में शामिल नहीं करते हैं। मैं कोड कॉपी और पेस्ट करूँगा। धन्यवाद! –

+4

''TakeUntil'' नाम अर्थ को व्यक्त नहीं करता है। बॉक्स से ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' – bradgonesurfing

+0

@bradgonesurfing TakeUntilInclusive? –

0
बस मस्ती के लिए

:

var a = new[] 
    { 
     "two", 
     "three", 
     "four", 
     "five", 
    }; 
    Func<string, bool> predicate = item => item.StartsWith("t");  
    a.TakeWhile(predicate).Concat(new[] { a.SkipWhile(predicate).FirstOrDefault() }) 
+0

इसमें दो फ़ंक्शन कॉल भी होते हैं। साथ ही, आप 'SkipWhile' को छोड़ सकते हैं और' ए फर्स्टऑर्डडिफॉल्ट (predicate) 'पर जा सकते हैं। –