2010-03-03 9 views
5

Ho un Dictionary<Guid, ElementViewModel>. (ElementViewModel è il nostro tipo complesso.) Aggiungo elementi al dizionario con uno stock standard items.Add(Guid.NewGuid, new ElementViewModel() { /*setters go here*/ });,C'è un modo per tenere traccia dell'ordine di articoli in un dizionario?

In una fase successiva rimuovo alcuni o tutti questi elementi.

Una visione semplicistica della mia ElementViewModel è questo:

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

Può essere significativo ricordare che le SequenceNos vengono compattati all'interno della collezione dopo l'aggiunta, nel caso in cui altre operazioni come lo spostamento e la copia ha avuto luogo. {1, 5, 6} -> {1, 2, 3}

Una visione semplicistica della mia operazione di rimozione è:

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

    CompactSequenceNumbers(); 
} 

Illustrerò il problema con un esempio:

aggiungo 3 elementi al dizionario:

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

rimuovo 2 articoli

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

Ora voglio aggiungere altri 2 articoli:

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

Sulla valutazione del dizionario, a questo punto, mi aspettavo l'ordine degli elementi per essere "Element 1", "Element 2, parte 2 ", "Elemento 3, parte 2"

ma in realtà è nel seguente ordine: "Element 1", "Elemento 3, parte 2", "Element 2, Parte 2"


Mi affido all'ordine di questi articoli per essere in un certo modo. Perché non è come previsto e cosa posso fare al riguardo?

+0

Certo, prendi alcuni segnalibri :) –

risposta

0

Purtroppo, un SortedDictionary non è abbastanza veloce per l'enorme quantità di dati che abbiamo per memorizzare in esso e un KeyedCollection sconfigge lo scopo di compattare manualmente la proprietà SequenceNo degli elementi.

A rigor di termini, dovremmo riscrivere il modo in cui il sequenziamento accade perché la mia soluzione non è la più bella:

Ogni volta che un elemento viene eliminato, nuovo il dizionario e aggiungere nuovamente gli articoli non-cancellato al dizionario newed al fine di mantenere la sequenza predefinita. -> pratica orribile, lo ammetto. Pianifica di cambiarlo non appena ho meno pressione.

14

. Netto I dizionari non sono ordinati in base alla progettazione.

Utilizzare invece KeyedCollection<TKey, TValue>; conserverà l'ordine in cui gli oggetti vengono aggiunti alla raccolta e utilizzerà anche una tabella hash per ricerche rapide.

Ad esempio:

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

Si noti che se si modifica la proprietà Id dopo l'elemento viene aggiunto alla raccolta, è necessario chiamare il metodo ChangeItemKey sulla raccolta. Consiglio vivamente di rendere la proprietà Id di sola lettura.

3

Qual è il motivo per cui non si utilizza uno System.Collections.Generic.SortedDictionary, sembra che quello che stai cercando per

Problemi correlati