2011-01-11 11 views
10

मेरे पास लोगों की ऑर्डर की गई सूची है। मेरे पास एक व्यक्ति है जो मुझे पता है कि उस संग्रह में मौजूद है। मैं कैसे निर्धारित कर सकता हूं कि सूची में कौन सा व्यक्ति अगला है?संग्रह में निर्दिष्ट तत्व के बाद तत्व को खोजने के लिए लिंक का उपयोग

उत्तर

24

आप कुछ इस तरह कर सकता है:

IEnumerable<Person> persons = .. 

var firstPersonAfterJack = persons.SkipWhile(p => p.Name != "Jack") 
            .ElementAt(1); //Zero-indexed, means second 

विचार एक दृश्य तत्व लंघन जब तक आप शर्त को पूरा जिसका परिणाम का उत्पादन होता है, तो कि अनुक्रम का दूसरा तत्व ले लो।

कोई गारंटी नहीं कि क्वेरी एक परिणाम वापस आ जाएगी अगर कोई (उदाहरण के लिए एक मैच कभी नहीं पाया जाता है, या उस क्रम का अंतिम तत्व है), तो आप ElementAtOrDefault साथ ElementAt बदल सकते हैं, और फिर एक null के लिए जाँच करने के लिए टेस्ट करना सफलता असफलता।

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

+0

बस मुझे इसे हराया :-) – finnw

+0

@finnw: हमने भी वही संपत्ति नाम चुना है। कल्पना कीजिए कि क्या हम एक ही व्यक्ति का नाम भी चुनते हैं। :) – Ani

+0

यह एक सामान्य लिंक से ऑब्जेक्ट क्वेरी के लिए एक अच्छा समाधान है, लेकिन 'SkipWhile' क्वेरी ऑपरेटर लिंक से एसक्यूएल में समर्थित नहीं है। –

3

SkipWhile एक ऐसी विधि है जो भविष्यवाणी करता है और भविष्यवाणी झूठी होने तक सबकुछ छोड़ देता है। यह उस तत्व और सब कुछ के बाद देता है।

var remainingPeople = collectionOfPeople.SkipWhile(p => !isThePerson(p)); 
if (remainingPeople.Count() == 1) 
{ 
    // the person was the last in the list. 
} 
var nextPerson = remainingPeople.Skip(1).First(); 

जहां isThePerson एक विधि है कि एक व्यक्ति लेता है और सच रिटर्न अगर यह व्यक्ति आप इसे रुचि रखते हैं है।

+0

यहां 2 मुद्दे हैं: 1) * पूरे * स्रोत अनुक्रम का एक अनावश्यक गणना है। 2) यह तब विफल हो जाएगा जब 'शेष लोग। गणना() == 0' यानी स्थिति कभी संतुष्ट नहीं होती है। – Ani

+0

1) मुझे नहीं लगता कि यह पूरे अनुक्रम को दो बार कहां समझाता है। क्या आप कहां बता सकते हैं? 2) अगर यह सूची में नहीं है तो यह असफल हो जाएगा लेकिन आवश्यकताएं कहती हैं कि व्यक्ति को सूची में गारंटी दी जाती है, इसलिए यह कोई समस्या नहीं है। –

+1

याद रखें कि अधिकांश LINQ ऑपरेटर स्थगित निष्पादन का उपयोग करते हैं। 'शेष लोग 'एक * क्वेरी * है, न कि सूची या सरणी। इसके परिणाम दो बार पुनः प्राप्त किए जाते हैं, एक बार 'गणना()' के लिए और एक बार 'छोड़ें (1)। सबसे पहले() '। – Ani

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