c# - Searching Hierarchical List -


मुझे एक साधारण वर्ग परिभाषित किया गया है:

  पब्लिक क्लास अनुक्रमणिका Entry {public bool उच्च स्कोर {प्राप्त करें; सेट; } सार्वजनिक सूची & lt; सूचकांक प्रविष्टि & gt; उप-प्रविष्टियां {प्राप्त करें; सेट; } // अन्य प्रॉपर्टी, आदि ...  

अब मुझे सूची के माध्यम से खोज करने की ज़रूरत है जिसमें एक हाईस्कोर प्रॉपर्टी है जिसे true < / em> । चूंकि यह एक सपाट सूची नहीं है, लेकिन एक पदानुक्रम जो अज्ञात स्तरों की गहराई से गहरा हो सकता है और चूंकि मैं जो आइटम देख रहा हूं वह सबईन्टीज़ सूचियों में से किसी एक में निहित हो सकती है, मैं एक सरल लम्बेडा की तरह नहीं कर सकता यह:

  var foundHighScore = myList.FirstOrDefault (आईई = & gt; IE.HighScore == सच);  

यहां मेरे पास कोड है I मुझे पता है कि यह बदसूरत है (कम से कम मुझे ऐसा लगता है) यह काम करता है, लेकिन यहां तक ​​कि दूर की बड़ी सूची पर पाप के रूप में धीमा होता है और मुझे यकीन है कि वहाँ एक बेहतर तरीका होना चाहिए।

  निजी सूचकांक Entry GetHighScoreEntry (IEnumerable & lt; सूचकांक प्रविष्टि & gt; प्रविष्टि सूची) {IndexEntry result = शून्य; अनुक्रमणिका प्रविष्टि पुनरावर्ती परिणाम = नल; विदेशी मुद्रा (सूचकांक प्रविष्टि प्रविष्टि प्रविष्टि प्रविष्टि में) {if (currentEntry.HighScore) {result = currentEntry; टूटना; // अब और देखने की जरूरत नहीं है, हम अपने उच्चतम स्कोर पाया .; } और {यदि ((वर्तमान ईंट्री। श्वेतरेंट्स == रिक्त) || (वर्तमान ईंट्री। श्वेतरेंटी.काउंट & lt; 1)) {continue; } Else {recursiveResult = GetHighScoreEntry (वर्तमान इंट्री .SubEntries); अगर (रिकर्सिव रिजल्ट == रिक्त) जारी; परिणाम = रिकर्सिव रिजल्ट; टूटना; }}} वापसी परिणाम; }  

मुझे विश्वास है कि इस कोड को साफ करने और इसे और अधिक निष्पादक बनाने के लिए थोड़ा अधिक जटिल लैम्ब्डा या LINQ के साथ बेहतर तरीका है।

धन्यवाद आपकी सहायता के लिए पहले से।

अब तक जो भी समाधान किए गए सभी समाधान विशिष्ट हैं - ये सामान्य या सामान्य नहीं हैं , और इस प्रकार, अगली बार जब आपके पास पदानुक्रमित सूची है, आपको एक नया समाधान कोड करना होगा युक।

यह एक सामान्य, सामान्य समाधान है जो आपके सभी पदानुक्रमित आवश्यकताओं के लिए काम करेगा:

  सार्वजनिक स्थिर IEnumerable & lt; T & gt; लेफ्टिनेंट & lt; T & gt; (यह IEnumerable & lt; T & gt; अनुक्रम, फ़नक & lt; T, IEnumerable & lt; T & gt; childFetcher) {var मदों टू यिलिल्ड = नई कतार & lt; T & gt; (अनुक्रम); जबकि (आइटम्सटियोइल्ड.काउंट & gt; 0) {var आइटम = आइटम्स टू योयल्ड.डिच्यू (); उपज रिटर्न आइटम; Var बच्चे = बच्चेफ़ेचर (आइटम); अगर (बच्चों! = नल) {foreach (बच्चों में विभिन्न बच्चे) {itemsToYield.Enqueue (बच्चे); }}}}  

आप इसका उपयोग कैसे करेंगे:

  myList.Flatten (i = & gt; i.SubEntries) .FirstOrDefault (i = & Gt; i.HighScore);  

पनीर के रूप में आसान।

यह एक्सटेंशन विधि किसी पदानुक्रमित डेटा को एक फ्लैट सूची में बदलने के लिए इस्तेमाल किया जा सकता है, जिसे उन्हें LINQ का उपयोग करके खोजा जा सकता है।

इस समाधान के बारे में एक और बड़ी बात यह है कि आलसी मूल्यांकन का उपयोग किया जाता है, इस प्रकार यह केवल कॉलर की मांग के रूप में बहुत काम करता है उदाहरण के लिए, उपरोक्त कोड में, फ़्लैटन जैसे ही हाईस्कोर पाया जाता है, आइटम को मंथन करना बंद हो जाएगा।

यह समाधान भी पुनरावर्तन से बचा जाता है, जो गहराई से नेस्टेड पदानुक्रम के लिए एक महंगा ऑपरेशन हो सकता है, कई स्टैक आवंटन जो पुनरावर्ती समाधान होता है।


Comments

Popular posts from this blog

oracle - The fastest way to check if some records in a database table? -

php - multilevel menu with multilevel array -

jQuery UI: Datepicker month format -