C# 根据需要合并多个词典并聚合值
我在LINQ中通过调用GroupBy投影上的ToDictionary创建了三个字典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
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循环组成的块进行了比较,循环遍历每个字典,并在遇到之前看到的键时聚合值。这两种情况下的数字完全吻合。我现在更明白这一点了。非常感谢你!