在需要时合并多个字典和聚合值

时间:2018-04-25 14:57:01

标签: 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.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)从Key

中删除LocalCcyId列的分组

将在三个词典中的每个词典中出现相同键的实例,并且我需要聚合所有这些案例的总和。我如何在LINQ中实现这一目标?

2 个答案:

答案 0 :(得分:2)

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

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 =
(
    from x in dictionaryOne.Concat(dictionaryTwo).Concat(dictionaryThree)
    group x.Value by new { x.Key.Property1, x.Key.Property2 }
)
    .ToDictionary(x => new { x.Key.Property1, x.Key.Property2 }, x => x.Sum());

答案 1 :(得分:0)

假设您正在查询远程数据源,对数据运行两次查询或两次转换为美元并没有比使用字典和组合它们更有效,这就是我所做的。

首先,您需要将每个return Observable.create(observer => { setTimeout(() => { observer.next(); observer.complete(); }) }); 转换为具有所需数据的新匿名对象,然后按以下值对属性进行分组:

Dictionary