2010-03-03 15 views
5

Dictionary<Guid, ElementViewModel> var. (ElementViewModel kendi karmaşık tipimizdir.) Sözlüğe bir stok standart items.Add(Guid.NewGuid, new ElementViewModel() { /*setters go here*/ });,Sözlükteki öğelerin sıralamasını takip etmenin bir yolu var mı?

ile ürün ekleyelim. Daha sonraki bir aşamada, bu öğelerden bazılarını veya hepsini siliyorum.

benim ElementViewModel bir basit görünümü şudur:

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

Bu SequenceNos hareketli ve kopyalama gerçekleşti gibi durumlarda, ekledikten sonra koleksiyon içinde diğer işlemler sıkıştırılmış olduğundan bahsetmek önemli olabilir. {1, 5, 6} -> {1, 2, 3}

zaman kaldırma işleminin Basit bir görünüşüdür:

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

    CompactSequenceNumbers(); 
} 

Bir örnekle sorun açıklayacaktır:

Ben sözlüğe 3 öğe ekleyin:

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

Ben 2 öğeleri kaldırmak

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

Şimdi 2 diğer öğeleri eklemek istiyorum: Ben "Eleman 1", "Öğe 2, Bölüm 2 olmak öğelerin sırasını beklenen bu noktada sözlüğe değerlendirilmesi üzerine

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

", "Eleman 3, Bölüm 2"

ama şu sırayla aslında: " Eleman 1", "Eleman 3, Bölüm 2", "Unsuru 2 Bölüm 2"


Bu öğelerin sırasına belirli bir şekilde güveniyorum. Neden beklendiği gibi değil ve bu konuda ne yapabilirim?

+0

Elbette, bazı yer imleri alın :) –

cevap

0

aradığınız gibi görünüyor İçerisinde ve bir KeyedCollection elementlerin SekansNo özelliğini el ile sıkıştırma amacını elden çıkarır.

Kesinlikle benim çözüm güzel değil çünkü sıralama olur bu şekilde yeniden konuşmak gerekirse,: Bir öğe silindiğinde her zaman, sözlüğü yeni ve Yenilenmistir sözlüğe olmayan silinmiş öğeleri yeniden eklemeniz

varsayılan sıralamayı korumak için. -> çirkin uygulama, itiraf ediyorum. Daha az baskı aldığım anda değiştirmeyi planla.

14

.Net Sözlükleri, tasarım gereği sırasızdır.

Bunun yerine KeyedCollection<TKey, TValue> kullanmalısınız; ürünlerin koleksiyona eklendiği sırayı koruyacak ve aynı zamanda hızlı aramalar için bir karma tablo kullanacaktır. Örneğin

: öğe koleksiyonuna eklenir sonra Id özelliğini değiştirirseniz, koleksiyonunda ChangeItemKey yöntemini çağırmak için ihtiyaç duyacakları

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

Not. Id özelliğinin salt okunur olmasını kesinlikle öneririz.

3

Eğer bir System.Collections.Generic.SortedDictionary kullanmayan bir nedeni, bir SortedDictionary biz saklamak zorunda verilerin büyük miktarda yeterince hızlı değil ne yazık ki