Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据需要合并多个词典并聚合值_C#_Linq - Fatal编程技术网

C# 根据需要合并多个词典并聚合值

C# 根据需要合并多个词典并聚合值,c#,linq,C#,Linq,我在LINQ中通过调用GroupBy投影上的ToDictionary创建了三个字典 var dictionaryOne = _repositoryOne.GetData() .GroupBy(d => new { d.Property1, d.Property2, d.LocalCcyId}) .ToDictionary(d => new { d.Key.Property1, d.Key.Property2, d.Key

我在LINQ中通过调用GroupBy投影上的ToDictionary创建了三个字典

var dictionaryOne = _repositoryOne.GetData()
.GroupBy(d => new { d.Property1, d.Property2, d.LocalCcyId})
.ToDictionary(d =>
    new
    {
        d.Key.Property1,
        d.Key.Property2,
        d.Key.LocalCcyId
    },
    v => v.Sum(l => ConvertToUsd(effectiveDate, l.LocalCcyId, l.Amount))); 

var dictionaryTwo = _repositoryTwo.GetData()
.GroupBy(d => new { d.Property1, d.Property2, d.LocalCcyId})
.ToDictionary(d =>
    new
    {
        d.Key.Property1,
        d.Key.Property2,
        d.Key.LocalCcyId
    },
    v => v.Sum(l => ConvertToUsd(effectiveDate, l.LocalCcyId, l.Balance))); 

var dictionaryThree = _repositoryThree.GetData()
.GroupBy(d => new { d.Property1, d.Property2, d.LocalCcyId})
.ToDictionary(d =>
    new
    {
        d.Key.Property1,
        d.Key.Property2,
        d.Key.LocalCcyId
    },
    v => v.Sum(l => ConvertToUsd(effectiveDate, l.LocalCcyId, l.Total))); 
我想把这些合并成一本字典,然后 i) 总结以美元为单位的价值& ii)从键中删除grouping by LocalCcyId列


这三个字典中的每一个都会出现同一个键的实例,我需要汇总所有这些情况的总和。在LINQ中如何实现这一点?

假设您正在查询一个远程数据源,对数据运行两次查询或两次转换到USD似乎并没有比使用字典并组合它们更有效,所以我就是这么做的

首先,您需要将每个
字典
转换为具有所需数据的新匿名对象,然后按属性对值求和进行分组:

var allDictionary = dictionaryOne.Select(kv => new { kv.Key.Property1, kv.Key.Property2, kv.Value })
                                 .Concat(dictionaryTwo.Select(kv => new { kv.Key.Property1, kv.Key.Property2, kv.Value }))
                                 .Concat(dictionaryThree.Select(kv => new { kv.Key.Property1, kv.Key.Property2, kv.Value }))
                                 .GroupBy(k2v => new { k2v.Property1, k2v.Property2 })
                                 .ToDictionary(k2vg => new { k2vg.Key.Property1, k2vg.Key.Property2 }, k2vg => k2vg.Sum(k2v => k2v.Value));

假设您正在查询一个远程数据源,在数据上运行两次查询或两次转换到USD似乎并不比使用字典并组合它们更有效,所以我就是这么做的

首先,您需要将每个
字典
转换为具有所需数据的新匿名对象,然后按属性对值求和进行分组:

var allDictionary = dictionaryOne.Select(kv => new { kv.Key.Property1, kv.Key.Property2, kv.Value })
                                 .Concat(dictionaryTwo.Select(kv => new { kv.Key.Property1, kv.Key.Property2, kv.Value }))
                                 .Concat(dictionaryThree.Select(kv => new { kv.Key.Property1, kv.Key.Property2, kv.Value }))
                                 .GroupBy(k2v => new { k2v.Property1, k2v.Property2 })
                                 .ToDictionary(k2vg => new { k2vg.Key.Property1, k2vg.Key.Property2 }, k2vg => k2vg.Sum(k2v => k2v.Value));

在我看来,这就是你所需要的:

var finalDictionary =
    dictionaryOne
        .Concat(dictionaryTwo)
        .Concat(dictionaryThree)
        .GroupBy(x => new { x.Key.Property1, x.Key.Property2 }, x => x.Value)
        .ToDictionary(x => new { x.Key.Property1, x.Key.Property2 }, x => x.Sum());
或者,使用LINQ语法(尽可能多地):


在我看来,这就是你所需要的:

var finalDictionary =
    dictionaryOne
        .Concat(dictionaryTwo)
        .Concat(dictionaryThree)
        .GroupBy(x => new { x.Key.Property1, x.Key.Property2 }, x => x.Value)
        .ToDictionary(x => new { x.Key.Property1, x.Key.Property2 }, x => x.Sum());
或者,使用LINQ语法(尽可能多地):


为什么不在调用
ToDictionary
之前先对数据源进行
Concat
处理呢?我可以试试。每个源的数据结构都非常不同,我必须对每个源进行额外的选择,以使它们与Concat一起工作。@nvoigt-我尝试过,但无法使其工作。如果我在GroupBy之后选择了一个选项,那么我就不能调用ToDictionary了。为什么不在调用ToDictionary之前先调用数据源呢?我可以试试。每个源的数据结构都非常不同,我必须对每个源进行额外的选择,以使它们与Concat一起工作。@nvoigt-我尝试过,但无法使其工作。如果我在GroupBy之后选择,那么我就不能在itThanks上调用ToDictionary,唯一的问题是每个字典中都有“重复”的键。对于这些情况,我需要聚合键(Sum)的值。@RahulMisra-不,这应该不是问题。这个小组消除了重复的,确实如此。为了确保这一点,我研究了Concat实现,它只返回给定给它的每个集合中的所有元素,然后GroupBy完成聚合它的工作。我将结果与另一个由三个foreach循环组成的块进行了比较,循环遍历每个字典,并在遇到之前看到的键时聚合值。这两种情况下的数字完全吻合。我现在更明白这一点了。非常感谢你!谢谢,唯一的问题是每个字典中都有“重复”键。对于这些情况,我需要聚合键(Sum)的值。@RahulMisra-不,这应该不是问题。这个小组消除了重复的,确实如此。为了确保这一点,我研究了Concat实现,它只返回给定给它的每个集合中的所有元素,然后GroupBy完成聚合它的工作。我将结果与另一个由三个foreach循环组成的块进行了比较,循环遍历每个字典,并在遇到之前看到的键时聚合值。这两种情况下的数字完全吻合。我现在更明白这一点了。非常感谢你!