How to Design Collections Allowing Duplicate Keys?

To design a data structure that can hold key-value pairs with a possible duplicate keys, we can go with one of the following.

By design, a Dictionary needs unique key elements, with no possibility for inclusion of duplicate keys. However, when we need a data structure capable of accommodating key-value pairs with the possibility of duplicate keys, we need to look for alternative approaches.

We can explore options such as utilizing a custom class to encapsulate both key and value, employing a List of KeyValuePair objects, or considering specialized data structures like a Lookup to handle scenarios where duplicate keys are permissible.

Each of these strategies offers different advantages based on the specific requirements of the use case.

A List of Key Value Pairs

we maintain a List of Key Value pairs and since a List doesn’t have a key concept, we can still store key values for duplicate keys.

var a = new List<KeyValuePair<char, C>>();
a.Add(new KeyValuePair<char, C>('c', new C
{
    Id = 1001,
    Name = "Diippop",
    AddedOn = DateTime.Now
}));

A Dictionary that stores a collection

we can push the values that come in for a key into a collection and still maintain a unique key.

var d= new Dictionary<char, List<C>>();
d.Add('c', new List<C>());
d['c'].Add(new C
{
    Id = 1001,
    Name = "Diippop"
});

Using a LINQ Lookup

a data structure available from the System.Linq namespace which stores a grouping of values for a defined Key. The Lookup can then be looked up for a key with constant time and the value collection can be iterated.

var a = new List<C>()
{
    new C
    {
        Id = 1001,
        Name = "Diippop"
    },
    new C
    {
        Id = 1002,
        Name = "Diippop"
    }
};
var lookup = a.ToLookup(x => x.Name.Substring(0, 1), x => x.Id);
foreach (var e in lookup)
{
    Console.WriteLine(
quot;Key: {e.Key}");
    foreach (var k in e)
    {
        Console.WriteLine(k);
    }
}
Output:
Key: D
1001
1002

Buy Me A Coffee

Found this article helpful? Please consider supporting!

Ram
Ram

I'm a full-stack developer and a software enthusiast who likes to play around with cloud and tech stack out of curiosity. You can connect with me on Medium, Twitter or LinkedIn.

Leave a Reply

Your email address will not be published. Required fields are marked *