2012-01-06 24 views
13

क्या कोई तरीका या तकनीक है जो आपको Dictionary<TKey, TValue> में एक तत्व डालने की अनुमति देती है, यह गारंटी देता है कि आइटम उस कुंजीपटल के कीकोलेक्शन की पहली अनुक्रमणिका में है।शब्दकोश में पहली अनुक्रमणिका में तत्व कैसे सम्मिलित करें?

उदाहरण के लिए:

dic.Add("key", "value", 0); 
// where `0` is the index that `key` to be inserted. 

foreach(KeyValuePair<String, String> key in dic) 
{ 
    Console.WriteLine("{0} = {1}", key.Key, key.Value); 
} 

आउटपुट::

key = value 
foo = baa 
a = b 

किसी भी मदद की बहुत सराहना की है

Dictionary<String, String> dic = foo.GetOutput(); 

// `dic` is something like: 

// {"foo", "baa"}, 
// {"a", "b"} 

मैं की तरह कुछ की जरूरत है। अग्रिम में धन्यवाद!

+2

की शुरुआत क्या एक शब्दकोश का उपयोग करने के लिए आपकी आवश्यकता है में तत्व सम्मिलित होगा मदद मिल सकती है? एक शब्दकोश संग्रह में वस्तुओं का क्रम लचीला होना है (आप उन्हें फिर से क्रमबद्ध कर सकते हैं, आदि), सूचकांक उपयोग से छिपा हुआ है। आप एक अलग प्रकार के संग्रह का उपयोग करना चाह सकते हैं जो आपकी आवश्यकताओं के आधार पर अधिक उपयुक्त होगा। –

उत्तर

20

शब्दकोश का उपयोग नहीं कर रहा।

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

यह एक शब्दकोश को लागू करने का एकमात्र तरीका नहीं है। SortedDictionary<TKey, TValue> आंतरिक रूप से एक वृक्ष संरचना का उपयोग करता है और इसलिए हमेशा क्रम में कुंजी रखता है। इस मामले में हम अभी भी शुरुआत में कुछ नहीं डाल सकते हैं, बल्कि हम कुछ डालेंगे और इसे उचित जगह पर रखा जाएगा।

अगर ऑर्डरिंग आप सबसे ज्यादा परवाह करते हैं, तो आप बिल्कुल एक पक्चर नहीं चाहते हैं। इसके बजाय आप या तो List<KeyValuePair<TKey, TValue>> चाहते हैं या आप एक ऐसी संरचना चाहते हैं जो सूची और एक शब्दकोश की कार्यक्षमता दोनों प्रदान करे, जो OrderedDictionary द्वारा प्रदान की जाती है। यह सामान्य नहीं है, लेकिन आप आसानी से इसके आसपास एक सामान्य रैपर बना सकते हैं (जेनेरिक का उपयोग करके आंतरिक रूप से प्रदर्शन लाभ नहीं देते हैं, लेकिन उपयोग में टाइप-सुरक्षा देते हैं)।

+0

तो, 'ऑर्डरबी' जैसी विधि का उद्देश्य क्या है? (लिंक विस्तार)। किस क्रम में गणना प्रविष्टियों प्रविष्टि होगी? – Keren

+0

@Keren उद्देश्य किसी विशेष मानदंड द्वारा आदेशित तत्व प्राप्त करना है और इसके माध्यम से गणना करने वाला कुछ उस क्रम में तत्वों तक पहुंच जाएगा। (स्रोत को किसी भी क्रम में एक्सेस किया जाएगा और आदेश पूरा होने पर ऑर्डरिंग होता है)। मुझे यकीन नहीं है कि यह कैसे प्रासंगिक है। –

+0

मैं जो कहने की कोशिश कर रहा हूं वह यह है कि शब्दकोश में किसी प्रकार का ऑर्डर होता है जो 'कुंजी' पर निर्भर नहीं करता है। इस कारण से, मैं इस आदेश को नियंत्रित करने का एक तरीका उम्मीद करूंगा। मैं समझता हूं कि नहीं है। – Keren

2

Dictionary<TKey, TValue> स्वाभाविक रूप से अनियंत्रित है (या बल्कि, आदेश अप्रत्याशित है और इस पर भरोसा नहीं किया जाना चाहिए)। यदि आप किसी प्रकार के ऑर्डरिंग चाहते हैं, तो आपको एक अलग प्रकार का उपयोग करने की आवश्यकता है। अपनी आवश्यकताओं के बारे में और जानने के बिना किसी भी विशेष प्रकार की सिफारिश करना मुश्किल है।

2

Dictionary<TKey,TValue> कक्षा आदेशित तरीके से आइटम नहीं रखती है, इसलिए कोई "पहली" वस्तु नहीं है।

SortedDictionary<Tkey,TValue> (.NET 4.0+) है, जो कि कुंजी द्वारा क्रमबद्ध है, लेकिन फिर से, यह "पहले" का एक बहुत ही अस्पष्ट विचार है।

2

Dictionary<TKey, TValue> आदेश नहीं दिया जा सकता है।

आप इसके बजाय SortedDictionary<TKey, TValue> आज़मा सकते हैं, लेकिन उस को कुंजी द्वारा क्रमबद्ध किया जाता है, न कि एक अलग इंडेक्स द्वारा।

7

शब्दकोश अनियंत्रित हैं; तत्वों को एक कुंजी के साथ पुनर्प्राप्त किया जाना है, जिसका हैश अपने मूल्य के स्थान पर इंगित करता है।

आप जो चाहें List <KeyValuePair> है, जिनके तत्वों को एक विशिष्ट अनुक्रमणिका में डाला जा सकता है।

List<KeyValuePair<string, string>> list = dic.ToList(); 
list.Insert(0, new KeyValuePair<string, string>("a", "b")); 

foreach(KeyValuePair<string, string> pair in list) 
    Console.WriteLine("{0} = {1}", pair.Key, pair.Value); 
3

यह संभव नहीं Dictionary<TKey, TValue> साथ के रूप में यह प्रस्तुत करता है यह एक अव्यवस्थित ढंग से मूल्यों जब प्रगणित है। SortedDictionary<TKey, TValue> है जो ऑर्डरिंग प्रदान करता है लेकिन यह सीधे कुंजी मान के विरुद्ध IComparer<TKey> का उपयोग कर ऐसा करता है। यहां आप String होने की कुंजी चाहते हैं और int पर आधारित ऑर्डर कर रहे हैं। इन प्रकारों में से किसी के साथ यह संभव नहीं है।

मुझे लगता है कि आपको इन विशिष्ट विशिष्ट अर्थशास्त्र के साथ एक नया प्रकार लागू करने की आवश्यकता होगी। उदाहरण के लिए।

class OrderedMap<TKey, TValue> { 
    private readonly Dictionary<TKey, TValue> _map = new Dictionary<TKey, TValue>(); 
    private readonly List<TKey> _list = new List<TKey>(); 

    public void Add(TKey key, TValue value) { 
    if (!_map.ContainsKey(key)) { 
     _list.Add(key); 
    } 
    _map[key] = value; 
    } 

    public void Add(TKey key, TValue value, int index) { 
    if (_map.ContainsKey(key)) { 
     _list.Remove(key); 
    } 
    _map[key] = value; 
    _list.Insert(index, key); 
    } 

    public TValue GetValue(TKey key) { 
    return _map[key]; 
    } 

    public IEnumerabe<KeyValuePair<TKey, TValue>> GetItems() { 
    foreach (var key in _list) { 
     var value = _map[key]; 
     yield return new KeyValuePair<TKey, TValue>(key, value); 
    } 
    } 
} 

नोट इस एक पारंपरिक Dictionary<TKey, TValue> पर कुछ गैर तुच्छ प्रदर्शन अंतर के साथ आता है। उदाहरण के लिए Add और Remove धीमे हैं।

1

यह मेरा समाधान है, शायद सबसे अच्छा समाधान नहीं है लेकिन यह काम करता है। =)

public static ComboBox FillDropDownList(Dictionary<String, String> dictionary, ComboBox dropDown, String selecione) 
{ 
    var d = new SortedDictionary<String, String>(); 

    d.Add("0", selecione); 

    foreach (KeyValuePair<string, string> pair in dictionary) 
    { 
     d.Add(pair.Key, pair.Value); 
    } 

    dropDown.DataSource = new BindingSource(d, null); 
    dropDown.DisplayMember = "Value"; 
    dropDown.ValueMember = "Key"; 

    dropDown.SelectedIndex = 0; 

    return dropDown; 
} 
3

मुझे पता है कि यह तीन साल का प्रश्न है। लेकिन इस समस्या का एक समाधान मिला। यह कोई है

Dictionary<String, String> dic = foo.GetOutput(); 

dic = (new Dictionary<string, string> {{"key","value"}}).Concat(dic).ToDictionary(k => k.Key, v => v.Value); 

इस शब्दकोश :)

+1

यह एक कार्यान्वयन विवरण है, भले ही शब्दकोश का आंतरिक सरणी का आकार बदलता है, आपको गारंटी नहीं है कि पहला आइटम पहला आइटम रहेगा। –

+0

@ एमजेके धन्यवाद .. इससे मदद मिली .. – Arnab

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