2009-10-23 13 views
10

में अंतिम तत्व प्राप्त करें मुझे this question दिखाई देता है।सॉर्टेड डिक्शनरी

मैं .NET 3.5 में सॉर्टेड डिक्शनरी में अंतिम तत्व कैसे प्राप्त कर सकता हूं।

उत्तर

15

आप उपयोग कर सकते हैं LINQ:

var lastItem = sortedDict.Values.Last(); 

तुम भी पिछले कुंजी प्राप्त कर सकते हैं:

var lastkey = sortedDict.Keys.Last(); 

var lastKeyValuePair = sortedDict.Last(); 

इस के साथ Key और Value गुण आप एक KeyValuePair<TKey, TValue> दे देंगे: आप भी पिछले कुंजी-मान पेयर मिल सकती है।

ध्यान दें कि यदि शब्दकोश खाली है तो यह अपवाद फेंक देगा; यदि आप इसे नहीं चाहते हैं, तो LastOrDefault पर कॉल करें।

+5

इन विधियों की संभावना ट्रिगर गणन किया है। मुझे आश्चर्य है कि क्या बिना किसी गणना के अंतिम तत्व (या किसी भी स्थिति सूचकांक से तत्व) प्राप्त करने का कोई तरीका है? चूंकि सॉर्टेड डिक्शनरी को पेड़ में सॉर्ट किया गया है, यह सिद्धांत में संभव हो सकता है? –

+1

@ रोलैंड पिहलाकास: सिद्धांत रूप में, हां। अभ्यास में, मुझे ऐसा नहीं लगता है। – SLaks

+9

किसी C++ पृष्ठभूमि से किसी के लिए, इसे स्वीकार करना मुश्किल है। अंतिम तत्व प्राप्त करने के लिए पूरे क्रमबद्ध शब्दकोश के माध्यम से गणना करना निराशाजनक रूप से अक्षम है। क्या आसपास के अधिक सक्षम सी # संग्रह पुस्तकालय हैं? –

1

आप SortedDictionary.Values.Last();

उपयोग कर सकते हैं या यदि आप कुंजी और मान चाहते

SortedDictionary.Last(); 
10

Last विस्तार विधि आपको परिणाम देगा, लेकिन आपको वहां पहुंचने के लिए पूरे संग्रह को गिनना होगा। यह Min और Max सदस्यों विशेष रूप से विचार कर आंतरिक रूप से यह एक SortedSet<KeyValuePair<K, V>> जो Min और Max गुण है के द्वारा समर्थित है का खुलासा नहीं करता इस तरह के एक शर्म की बात है SortedDictionary<K, V> है।

  1. स्विच एक SortedList<K, V> रहे हैं:

    तो हे (एन) वांछनीय नहीं है, तो आप कुछ ही विकल्प हैं। फिर से किसी कारण से बीसीएल डिफ़ॉल्ट रूप से इसे पैक नहीं करता है। आप ओ (1) समय में अधिकतम (या न्यूनतम) मान प्राप्त करने के लिए अनुक्रमणिका का उपयोग कर सकते हैं। विस्तार विधियों के साथ विस्तार अच्छा होगा।

    //Ensure you dont call Min Linq extension method. 
    public KeyValuePair<K, V> Min<K, V>(this SortedList<K, V> dict) 
    { 
        return new KeyValuePair<K, V>(dict.Keys[0], dict.Values[0]); //is O(1) 
    } 
    
    //Ensure you dont call Max Linq extension method. 
    public KeyValuePair<K, V> Max<K, V>(this SortedList<K, V> dict) 
    { 
        var index = dict.Count - 1; //O(1) again 
        return new KeyValuePair<K, V>(dict.Keys[index], dict.Values[index]); 
    } 
    

    SortedList<K, V> अन्य जुर्माना के साथ आता है। तो आप देख सकते हैं: What's the difference between SortedList and SortedDictionary?

  2. अपना खुद का SortedDictionary<K, V> कक्षा लिखें। यह बहुत तुच्छ है। SortedSet<KeyValuePair<K, V>> को आंतरिक कंटेनर के रूप में रखें और Key भाग पर तुलना करें। कुछ ऐसा:

    public class SortedDictionary<K, V> : IDictionary<K, V> 
    { 
        SortedSet<KeyValuePair<K, V>> set; //initialize with appropriate comparer 
    
        public KeyValuePair<K, V> Min { get { return set.Min; } } //O(log n) 
        public KeyValuePair<K, V> Max { get { return set.Max; } } //O(log n) 
    } 
    

    यह ओ (लॉग एन) है। दस्तावेज नहीं किया गया, लेकिन मैंने कोड की जांच की।

  3. उपयोग बारीकियों प्रतिबिंब समर्थन सेट जो SortedDictionary<K, V> वर्ग के निजी सदस्य है पहुँच सकते हैं और आह्वान Min और Max गुण है। कोई प्रतिनिधि को संकलित करने और इसे प्रदर्शन के लिए कैश करने के लिए अभिव्यक्तियों पर भरोसा कर सकता है। ऐसा करने के लिए यह बहुत खराब विकल्प है। विश्वास नहीं कर सकता मैंने यह सुझाव दिया।

  4. अन्य कार्यान्वयन पर निर्भर करता है, उदाहरण के लिए। TreeDictionary<K, V> from C5 के लिए।वे FindMin और FindMaxboth of which are O(log n)

+0

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

+0

आप अपने दूसरे विकल्प के लिए इंडेक्सर/'TryGetValue' को कैसे कार्यान्वित करेंगे? – CodesInChaos

+0

@CodesInChaos आप सही हैं, जो इसे बेकार बनाता है। यह .NET में दुखद सेट वास्तविक संदर्भ प्राप्त करने का कोई तरीका नहीं दिखाता है। मुझे जवाब संपादित करना चाहिए। – nawfal

-1

SortedList सूची ...

list[ Keys[Keys.Count - 1] ]; // returns the last entry in list 
संबंधित मुद्दे