2010-03-03 10 views
5

मेरे पास Dictionary<Guid, ElementViewModel> है। (ElementViewModel हमारा स्वयं का जटिल प्रकार है।) मैं स्टॉक मानक items.Add(Guid.NewGuid, new ElementViewModel() { /*setters go here*/ });,क्या एक शब्दकोश में वस्तुओं के क्रम का ट्रैक रखने का कोई तरीका है?

बाद के चरण में शब्दकोश में आइटम जोड़ता हूं, बाद में मैं कुछ या सभी आइटम हटा देता हूं।

मेरी ElementViewModel का एक साधारण दृश्य यह है:

class ElementViewModel 
{ 
    Guid Id { get; set; } 
    string Name { get; set; } 
    int SequenceNo { get; set; } 
} 

ऐसा नहीं है कि SequenceNos संग्रह के भीतर जोड़ने के बाद, मामले में अन्य कार्यों चलती और नकल जगह ले ली की तरह जमा कर रहे हैं उल्लेख करने के लिए महत्वपूर्ण हो सकता है। {1, 5, 6} -> {1, 2, 3}

मेरी निकालें 'संचालन का एक साधारण दृश्य है:

public void RemoveElementViewModel(IEnumerable<ElementViewModel> elementsToDelete) 
{ 
    foreach (var elementViewModel in elementsToDelete) 
     items.Remove(elementViewModel.Id); 

    CompactSequenceNumbers(); 
} 

मैं एक उदाहरण के साथ समस्या को वर्णन होगा:

मैं शब्दकोश में 3 आइटम जोड़ें:

var newGuid = Guid.NewGuid(); 
items.Add(newGuid, new MineLayoutElementViewModel { Id = newGuid, SequenceNo = 1, Name = "Element 1" }); 
newGuid = Guid.NewGuid(); 
items.Add(newGuid, new MineLayoutElementViewModel { Id = newGuid, SequenceNo = 2, Name = "Element 2" }); 
newGuid = Guid.NewGuid(); 
items.Add(newGuid, new MineLayoutElementViewModel { Id = newGuid, SequenceNo = 3, Name = "Element 3" }); 

2 आइटम हटा

RemoveElementViewModel(new List<ElementViewModel> { item2, item3 }); //imagine I had them cached somewhere. 

अब मैं 2 अन्य मदों जोड़ना चाहते हैं:

newGuid = Guid.NewGuid(); 
items.Add(newGuid, new MineLayoutElementViewModel { Id = newGuid, SequenceNo = 2, Name = "Element 2, Part 2" }); 
newGuid = Guid.NewGuid(); 
items.Add(newGuid, new MineLayoutElementViewModel { Id = newGuid, SequenceNo = 3, Name = "Element 3, Part 2" }); 

इस बिंदु पर शब्दकोश के मूल्यांकन पर, मैं होने की "तत्व 1", "एलिमेंट 2, भाग 2 वस्तुओं के आदेश की उम्मीद "" एलीमेंट 3, भाग 2 "

लेकिन यह वास्तव में इस क्रम में है: " तत्व 1 "," एलीमेंट 3, भाग 2 "," एलिमेंट 2 भाग 2 "


,

मैं इन वस्तुओं के आदेश पर एक निश्चित तरीके से भरोसा करता हूं। यह अपेक्षित क्यों नहीं है और मैं इसके बारे में क्या कर सकता हूं?

+0

निश्चित रूप से, कुछ बुकमार्क प्राप्त करें :) –

उत्तर

0

दुर्भाग्य से देख रहे हैं, एक SortedDictionary काफी तेजी से हम स्टोर करने के लिए है डेटा की बड़ी राशि के लिए नहीं है की तरह लगता है इसमें और एक KeyedCollection अनुक्रमों को मैन्युअल रूप से तत्वों की संपत्ति को कॉम्पैक्ट करने के उद्देश्य को हरा देता है।

सच पूछिये तो, हम रास्ता है कि अनुक्रमण होता पुनर्लेखन करना चाहिए, क्योंकि मेरी समाधान सुंदर नहीं है:

हर बार एक आइटम हटा दी जाती है, शब्दकोश नए और newed शब्दकोश में गैर हटाए गए आइटम फिर से जोड़ने डिफ़ॉल्ट अनुक्रम बनाए रखने के लिए। -> घृणास्पद अभ्यास, मैं मानता हूं। जैसे ही मेरे पास कम दबाव होता है, इसे बदलने पर योजना बनाएं।

14

नेट शब्दकोश डिज़ाइन द्वारा अनियंत्रित हैं।

आपको इसके बजाय KeyedCollection<TKey, TValue> का उपयोग करना चाहिए; यह ऑर्डर को सुरक्षित रखेगा कि आइटम संग्रह में जोड़े गए हैं और तेजी से लुकअप के लिए हैश टेबल का भी उपयोग करेंगे।

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

class ElementViewModelCollection : KeyedCollection<Guid, ElementViewModel> { 
    protected override Guid GetKeyForItem(ElementViewModel item) { return item.Id; } 
} 

items.Add(new MineLayoutElementViewModel { Id = Guid.NewGuid(), SequenceNo = 3, Name = "Element 3" }); 

ध्यान दें कि अगर आप Id संपत्ति के बाद आइटम संग्रह में जोड़ा जाता है बदलने के लिए, आप संग्रह पर ChangeItemKey विधि कॉल करने की आवश्यकता होगी। मैं अत्यधिक अनुशंसा करता हूं कि आप केवल पढ़ने के लिए Id संपत्ति बनाएं।

3

किसी भी कारण है कि आप एक System.Collections.Generic.SortedDictionary उपयोग नहीं कर रहे हैं, क्या आप के लिए

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

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