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

Filed under:
|
|
|

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

Related posts about c#

Related posts about .NET