我有一个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
输出容器可以是字典或其他可枚举结构。
答案 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()));
这应该按日期对所有数据进行分组,然后它会创建一个字典,其中包含总计值的日期