52718

[code]

    Dictionary<string, classA>()
    
    classA{
     int AAA,
     int BBB
    }
    
[/code]

上記のようなディクショナリーをlinqのconcatにてそれぞれの値を合計することはできますでしょうか。

例えば・・・  
dicA {string: "C", classA {AAA:1, BBB:2}}  
dicB {string: "C", classA {AAA:3, BBB:4}}

上記のようにキーが同一のディクショナリーに対し、

[code]

    dicA.concat(dicB).GroupBy(e => e.Key, c => c.Value).～
    
[/code]

として、  
dicAの結果が  
dicA {string: "C", classA {AAA:4, BBB:6}}

とすることが理想です。

よろしくお願い致します。


CC BY-SA 4.0
2019-02-12T02:33:21.620
52711
2019-02-12T04:47:54.797
30948
question
c# linq
dictionaryの合計値の算出方法について


本家SOの[類似質問](https://stackoverflow.com/q/2812545)にある[解決済みの回答](https://stackoverflow.com/a/2812572)と同様の解法です。

[code]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class classA
        {
            public int AAA;
            public int BBB;
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var dicA = new Dictionary<string, classA> { { "C", new classA { AAA = 1, BBB = 2 } } };
                var dicB = new Dictionary<string, classA> { { "C", new classA { AAA = 3, BBB = 4 } } };
    
                // メソッド版
                dicA = dicA.Concat(dicB).GroupBy(e => e.Key).Select(g => new { Key = g.Key, AAA = g.Sum(p => p.Value.AAA), BBB = g.Sum(p => p.Value.BBB) })
                    .ToDictionary(item => item.Key, item => new classA { AAA = item.AAA, BBB = item.BBB });
                // クエリ版
                dicA = (from e in dicA.Concat(dicB)
                        group e by e.Key into g
                        select new { Key = g.Key, AAA = g.Sum(p => p.Value.AAA), BBB = g.Sum(p => p.Value.BBB) })
                    .ToDictionary(item => item.Key, item => new classA { AAA = item.AAA, BBB = item.BBB });
    
                foreach (var p in dicA)
                {
                    Console.WriteLine(string.Format("{0}: AAA = {1}, BBB = {2}", p.Key, p.Value.AAA, p.Value.BBB));
                }
            }
        }
    }
    
[/code]

メソッド版とクエリ版は全く同一の処理をしています。  
なので、そのまま実行すると`dicA`に`dicB`を2回足して下記の結果が出力されます。  
`C: AAA = 7, BBB = 10`

上記の版を片方削除すれば求める値を取得できます。  
ただし本家SO回答の注釈の通り、2つのDictionaryをIEnumerableとして集計し、新しいclassAを生成しているため、処理の効率が優れている訳ではありませんのでご留意願います。


CC BY-SA 4.0
2019-02-12T04:16:09.070
52718
2019-02-12T04:47:54.797
2019-02-12T04:47:54.797
9820
9820
52711
answer