Is there a way to keep track of the ordering of items in a dictionary?
Posted
by Corpsekicker
on Stack Overflow
See other posts from Stack Overflow
or by Corpsekicker
Published on 2010-03-03T16:08:59Z
Indexed on
2010/03/09
6:21 UTC
Read the original article
Hit count: 231
I have a Dictionary<Guid, ElementViewModel>
. (ElementViewModel is our own complex type.)
I add items to the dictionary with a stock standard items.Add(Guid.NewGuid, new ElementViewModel() { /*setters go here*/ });
,
At a later stage I remove some or all of these items.
A simplistic view of my ElementViewModel is this:
class ElementViewModel
{
Guid Id { get; set; }
string Name { get; set; }
int SequenceNo { get; set; }
}
It may be significant to mention that the SequenceNos are compacted within the collection after adding, in case other operations like moving and copying took place. {1, 5, 6} -> {1, 2, 3}
A simplistic view of my remove operation is:
public void RemoveElementViewModel(IEnumerable<ElementViewModel> elementsToDelete)
{
foreach (var elementViewModel in elementsToDelete)
items.Remove(elementViewModel.Id);
CompactSequenceNumbers();
}
I will illustrate the problem with an example:
I add 3 items to the dictionary:
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" });
I remove 2 items
RemoveElementViewModel(new List<ElementViewModel> { item2, item3 }); //imagine I had them cached somewhere.
Now I want to add 2 other items:
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 evaluation of the dictionary at this point, I expected the order of items to be "Element 1", "Element 2, Part 2", "Element 3, Part 2"
but it is actually in the following order: "Element 1", "Element 3, Part 2", "Element 2, Part 2"
I rely on the order of these items to be a certain way. Why is it not as expected and what can I do about it?
© Stack Overflow or respective owner