2010-03-03 10 views
5

Ich habe eine Dictionary<Guid, ElementViewModel>. (ElementViewModel ist unser eigener komplexer Typ.) Ich füge Artikel zum Wörterbuch mit einem Standard items.Add(Guid.NewGuid, new ElementViewModel() { /*setters go here*/ });,Gibt es eine Möglichkeit, die Reihenfolge von Elementen in einem Wörterbuch zu verfolgen?

hinzu

Zu einem späteren Zeitpunkt entferne ich einige oder alle diese Elemente.

Eine vereinfachende Sicht meiner ElementViewModel ist dies:

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

Es kann, dass die SequenceNos andere Operationen im Fall nach der Zugabe, in der Sammlung verdichtet werden zu erwähnen, von Bedeutung sein wie das Verschieben und Kopieren statt. {1, 5, 6} -> {1, 2, 3}

Eine vereinfachende Sicht meiner Entfernungsoperation ist:

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

    CompactSequenceNumbers(); 
} 

ich das Problem mit einem Beispiel veranschaulichen:

ich hinzufügen 3 Artikel zum Wörterbuch:

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" }); 

ich entferne 2 Artikel

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

Jetzt möchte ich 2 weitere Elemente hinzuzufügen:

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" }); 

Bei der Auswertung des Wörterbuchs an dieser Stelle ich die Reihenfolge der Elemente erwartet „Element 1“ sein, „Element 2, Teil 2 “, "Element 3, Teil 2"

aber es ist tatsächlich in der folgenden Reihenfolge: "Element 1", "Element 3, Part 2", "Element 2, Teil 2"


Ich verlasse mich auf die Reihenfolge dieser Gegenstände auf eine bestimmte Art und Weise. Warum ist es nicht wie erwartet und was kann ich dagegen tun?

+0

Sicher, ein paar Lesezeichen :) –

Antwort

0

Leider ist ein SortedDictionary nicht schnell genug für die große Menge an Daten, die wir speichern müssen in ihm und eine KeyedCollection schlägt den Zweck der manuellen Komprimierung der SequenceNo-Eigenschaft der Elemente fehl.

Streng genommen, sollten wir die Art und Weise neu zu schreiben, dass die Sequenzierung geschieht, weil meine Lösung nicht die schönsten ist:

Jedes Mal, wenn ein Element gelöscht wird, das Wörterbuch neu oder erneut fügen Sie die nicht-gelöschten Objekte zum newed Wörterbuch um die Standardsequenz beizubehalten. -> Scheußliche Praxis, gebe ich zu. Plane es zu ändern, sobald ich weniger Druck habe.

14

.Net Wörterbücher sind vom Design ungeordnet.

Sie sollten stattdessen eine KeyedCollection<TKey, TValue> verwenden; Es wird die Reihenfolge beibehalten, in der Elemente zur Auflistung hinzugefügt werden, und es wird auch eine Hash-Tabelle für schnelle Suchvorgänge verwendet.

Zum Beispiel:

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" }); 

Beachten Sie, dass, wenn Sie die Id Eigenschaft ändern, nachdem das Element der Sammlung hinzugefügt wird, werden Sie die ChangeItemKey Methode für die Sammlung aufrufen müssen. Ich empfehle dringend, dass Sie die Id Eigenschaft schreibgeschützt machen.

3

Gibt es Gründe, warum Sie keinen System.Collections.Generic.SortedDictionary verwenden, scheint wie das, was Sie suchen

Verwandte Themen