Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dictionary Union to dictionary? [duplicate]

Tags:

c#

.net

linq

In my code I have the line

var d3 = d.Union(d2).ToDictionary(s => s.Key, s => s.Value);

This feels odd because its likely I'll do this a lot. There is no .ToDictionary(). How do I union a dictionary and keep it as a dictionary?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<Tuple<int, string>>();
            list.Add(new Tuple<int, string>(1, "a"));
            list.Add(new Tuple<int, string>(3, "b"));
            list.Add(new Tuple<int, string>(9, "c"));
            var d = list.ToDictionary(
                s => s.Item1, 
                s => s.Item2);
            list.RemoveAt(2);
            var d2 = list.ToDictionary(
                s => s.Item1,
                s => s.Item2);
            d2[5] = "z";
            var d3 = d.Union(d2).ToDictionary(s => s.Key, s => s.Value);
        }
    }
}
like image 961
BruteCode Avatar asked Dec 05 '22 12:12

BruteCode


1 Answers

The problem with using the "straight" Union is that it does not interpret the dictionaries as dictionaries; it interprets dictionaries as IEnumerable<KeyValyePair<K,V>>. That is why you need that final ToDictionary step.

If your dictionaries do not have duplicate keys, this should work a little faster:

var d3 = d.Concat(d2).ToDictionary(s => s.Key, s => s.Value);

Note that the Union method will break too if the two dictionaries contain the same key with different values. Concat will break if the dictionaries contain the same key even if it corresponds to the same value.

like image 120
Sergey Kalinichenko Avatar answered Dec 24 '22 05:12

Sergey Kalinichenko