DuplicateDictionary - A dictionary-like class which allows duplicates
Such a data structure already exists, and is called ILookup&lt;TKey, TElement&gt;. It can be created using the ToLookup extension.


  The ToLookup&lt;TSource, TKey&gt;(IEnumerable&lt;TSource&gt;, Func&lt;TSource, TKey&gt;) method returns a Lookup&lt;TKey, TElement&gt;, a one-to-many dictionary that maps keys to collections of values. A Lookup&lt;TKey, TElement&gt; differs from a Dictionary&lt;TKey, TValue&gt;, which performs a one-to-one mapping of keys to single values.


var list = new List&lt;Tuple&lt;string, int&gt;&gt;
{
    Tuple.Create("a", 1),
    Tuple.Create("a", 2),
    Tuple.Create("a", 3),
    Tuple.Create("b", 4),
    Tuple.Create("c", 5)
};

var lookup = list.ToLookup(t =&gt; t.Item1, t =&gt; t.Item2);

foreach(var kv in lookup)
{
    Console.Write(kv.Key);
    Console.WriteLine(" - " + string.Join(", ", kv));
}

// prints
// a - 1, 2, 3
// b - 4
// c - 5


As Vince pointed out, your DuplicateDictionary will suffer from slow access. Lookup won't.