Question

I'm trying to compare two dictionaries, the program is written in C# Visual Studio 2010.

Dictionary<int, string> members1 = new Dictionaries<int, string>{
    {1, "adam"},
    {2, "bob"},
    {3, "cameron"}
}

Dictionary<int, string> members2 = new Dictionaries<int, string>{
    {1, "adam"},
    {2, "bill"},
    {4, "dave"}
}

I would like to find the same id (key), and it doesn't matter if the name (value) is the same or not.

I've been searching and found Intersect and Except, but I don't think it work quite the way I wanted it.

With the example above, if I call an Intersect function, I want it to return List<int>{1, 2}.

If I call something like members1.Except(members2), I want it to return

Dictionary<int, string> intersectMembers{
    {1, "adam"},
}

A solution I thought of doing is to write 2 for-loops and using dictionary.Contains(key) to get the result I want.

Is there a more straight forward way of doing this?

Thanks

Was it helpful?

Solution

If you want a "Common Dictionary" returned I believe you could do it this way:

   var intersectMembers =  members1.Keys.Intersect(members2.Keys)
                                  .ToDictionary(t => t, t => members1[t]);

or, alternatively:

   var intersectMembers =  members1.Where(x => members2.ContainsKey(x.Key))
                             .ToDictionary(x => x.Key, x => x.Value);

However, if you want a "Common List" returned then Sergey is right and you can implement his answer.

OTHER TIPS

 var commonKeys = members1.Keys.Intersect(members2.Keys); // { 1, 2 }

That will return IEnumerable<int> but you can call ToList() if you want list.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top