2010-03-03 27 views
5

Tôi có một Dictionary<Guid, ElementViewModel>. (ElementViewModel là loại phức hợp của chúng tôi.) Tôi thêm các mục vào từ điển với tiêu chuẩn chứng khoán items.Add(Guid.NewGuid, new ElementViewModel() { /*setters go here*/ });,Có cách nào để theo dõi thứ tự các mục trong từ điển không?

Ở giai đoạn sau, tôi xóa một số hoặc tất cả các mục này.

Một cái nhìn đơn giản của ElementViewModel của tôi là thế này:

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

Nó có thể là đáng kể kể rằng SequenceNos được đầm trong bộ sưu tập sau khi thêm, trong trường hợp các hoạt động khác như di chuyển và sao chép diễn ra. {1, 5, 6} -> {1, 2, 3}

Một cái nhìn đơn giản của hoạt động loại bỏ của tôi là:

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

    CompactSequenceNumbers(); 
} 

tôi sẽ minh họa cho vấn đề với một ví dụ:

tôi thêm 3 mục vào từ điển:

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

tôi loại bỏ 2 mục

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

Bây giờ tôi muốn thêm 2 mặt hàng khác:

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

On đánh giá của từ điển vào thời điểm này, tôi mong đợi thứ tự của mục được "Yếu tố 1", "Yếu tố 2, Phần 2 ", "Yếu tố 3, Phần 2"

nhưng nó thực sự là theo thứ tự sau: "Yếu tố 1", "Yếu tố 3 Phần 2", "Yếu tố 2, Phần 2"


Tôi dựa vào thứ tự của các mục này theo một cách nhất định. Tại sao nó không như mong đợi và tôi có thể làm gì với nó?

+0

Chắc chắn, nhận một số dấu trang :) –

Trả lời

0

Thật không may, một SortedDictionary là không đủ nhanh cho lượng lớn dữ liệu, chúng ta phải lưu trữ trong đó và KeyedCollection đánh bại mục đích nén thuộc tính SequenceNo của các phần tử theo cách thủ công.

Nói đúng ra, chúng ta nên viết lại cách mà trình tự xảy ra bởi vì giải pháp của tôi không phải là đẹp nhất:

Mỗi khi một mục bị xóa, mới vào từ điển và tái thêm các mặt hàng không bị xóa vào từ điển newed để duy trì chuỗi mặc định. -> thực hành ghê tởm, tôi thừa nhận. Kế hoạch thay đổi nó ngay sau khi tôi có ít áp lực hơn.

14

. Từ điển Net không bị sắp xếp theo thiết kế.

Thay vào đó, bạn nên sử dụng KeyedCollection<TKey, TValue>; nó sẽ bảo vệ thứ tự các mục được thêm vào bộ sưu tập và cũng sẽ sử dụng một bảng băm để tra cứu nhanh chóng.

Ví dụ:

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

Lưu ý rằng nếu bạn thay đổi Id tài sản sau khi mặt hàng đó sẽ được thêm vào bộ sưu tập, bạn sẽ cần phải gọi phương thức ChangeItemKey vào bộ sưu tập. Tôi đặc biệt khuyên bạn nên chỉ đọc thuộc tính Id.

3

Bất kỳ lý do tại sao bạn không sử dụng một System.Collections.Generic.SortedDictionary, có vẻ như những gì bạn đang tìm kiếm

Các vấn đề liên quan