Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

connect values with the same key in Dictionary<string, string>

Tags:

c#

dictionary

I need to combine 2 dictionary. they have the same key (KKK) with different values:

Dictionary<string, string> dic1 = ...Load***();
Dictionary<string, string> dic2 = ...Load***();

dic1:

...
[29] {[RCP, 555501001]}
[30] {[KKK, 04611105012042000120]}
...

dic2:

...
[49] {[SUM, 85737]}
[50] {[KKK, 04611701040040000180]}
...

Union:

Dictionary<string, string> dicUnion= dic1.Union(dic2).OrderBy(k => k.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

result:

ThrowArgumentException: The item with the same key has already been added.

I have connect values with the same key in union Dictionary:

...
[29] {[RCP, "555501001"]}
[30] {[KKK, "04611105012042000120 04611701040040000180"]}
[31] {[SUM, "85737"]}
...
like image 349
Denis repon Avatar asked Feb 11 '26 13:02

Denis repon


1 Answers

If you really want to use LINQ in this case(i'd prefer a loop):

var dicUnion = dic1.Concat(dic2)
    .GroupBy(kv => kv.Key)
    .ToDictionary(g => g.Key, g => String.Join(" ", g.Select(kv => kv.Value)));

This will merge both dictionaries but don't care about common keys or different values.

I need to combine 2 dictionary, they have the same key (KKK) with different values

Ok, if you only want to create a dictionary of common keys:

var union = from kv1 in dic1
            join kv2 in dic2
            on kv1.Key equals kv2.Key into keyGroup
            where keyGroup.Any()
            select new KeyValuePair<string, string>(kv1.Key, string.Join(" ", keyGroup.Select(kv => kv.Value)));

Dictionary<string, string> dicUnion = union.ToDictionary(kv => kv.Key, kv => kv.Value);

But instead of concatenating values which have the same key in both dictionaries, i'd use a different approach. Use a Lookup<TKey, TValue>. For example:

var keyLookup = dic1.Concat(dic2).ToLookup(kv => kv.Key, kv => kv.Value);

Now you can do wahtever you want with the values, f.e. create a List<string>:

List<string> values = keyLookup["KKK"].ToList();
like image 113
Tim Schmelter Avatar answered Feb 16 '26 00:02

Tim Schmelter



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!