Linq GroupBy /使用Key作为元组的字典聚合

时间:2016-09-08 14:18:56

标签: c# linq dictionary

我有一个Dictionary,它的Key是两个对象(Object1和Object2)的四部分元组,一个DateTime和一个Enum。存储在Dictionary中的值是Object3类型的对象。 Object3对象包含一个属性,该属性是一个整数值。我们只是说我们可以通过GetIntValue()方法访问它。 (这是 一个假设的例子;让我们不要再考虑是否将四元组作为关键是一个好主意!)

所以字典看起来像这样:

Dictionary<Tuple<Object1, Object2, DateTime, Enum1>, Object3> myDictionary

关键元组的DateTime部分以15分钟为增量给出。我想将密钥聚合到DAY级别,并将从GetIntValue()获得的int值相加。我知道我可以通过编程方式执行此操作是否使用循环,创建其他字典/列表等可能更好/更快,但我想知道这是否可以在单行LINQ语句中执行?

字典中的示例数据可能如下所示:

Object1 | Object2   | Datetime          | Enum  | Object3.GetIntValue()
o1      | p1        | 09/07/2016 8:00AM | Type1 | 30
o1      | p1        | 09/07/2016 8:15AM | Type1 | 20
o1      | p1        | 09/07/2016 8:30AM | Type1 | 10
o2      | p2        | 09/07/2016 8:00AM | Type1 | 0
o2      | p2        | 09/07/2016 8:15AM | Type1 | 10
o2      | p2        | 09/07/2016 8:30AM | Type1 | 5
o1      | p1        | 09/08/2016 8:00AM | Type1 | 0
o1      | p1        | 09/08/2016 8:15AM | Type1 | 30
o1      | p1        | 09/08/2016 8:30AM | Type1 | 5
o2      | p2        | 09/08/2016 8:00AM | Type1 | 0
o2      | p2        | 09/08/2016 8:15AM | Type1 | 0
o2      | p2        | 09/08/2016 8:30AM | Type1 | 1

所需的输出为:

Object1 | Object2   | Date part of Datetime | Enum  | Sum of Object3.GetIntValue()
o1      | p1        | 09/07/2016 12:00AM    | Type1 | 60
o2      | p2        | 09/07/2016 12:00AM    | Type1 | 15
o1      | p1        | 09/08/2016 12:00AM    | Type1 | 35
o2      | p2        | 09/08/2016 12:00AM    | Type1 | 1

输出容器可以是字典或其他可枚举结构。

2 个答案:

答案 0 :(得分:3)

假设您可以将int值传递给Object3的构造函数,它看起来就像这样。

var byDay = originalDictionary.GroupBy(
        kvp => Tuple.Create(
            kvp.Key.Item1, 
            kvp.Key.Item2, 
            kvp.Key.Item3.Date, 
            kvp.Key.Item4))
    .ToDictionary(
         grp => grp.Key, 
         grp => new Object3(grp.Sum(kvp => kvp.Value.GetIntValue())));

或者,如果您不需要它映射到Object3,而只需要int,您可以将最后一个lambda更改为

grp => grp.Sum(kvp => kvp.Value.GetIntValue())

答案 1 :(得分:0)

如果您只需要这一天和价值,那么您可以使用@ juharr的回答

 myDictionary.GroupBy(x => x.Datetime.Date)
             .ToDictionary(k => k.Key, 
                           v => v.Value.Sum(x => x.Object3.GetIntValue()));

这应该按日期对所有数据进行分组,然后它会创建一个字典,其中包含总计值的日期