首页 > 解决方案 > 按字典 LINQ 分组

问题描述

我有一个包含字典列表的列表。Dictionary 包含带有 DateTime 值的键“date”,以及对应于十进制数字值的各种其他键。我想按日期分组并对每个十进制数字进行平均。

我以前用 linq 做过这个,但似乎无法用字典弄清楚。

List<object> list = new List<object>();
Dictionary<string,object> dictionary = new Dictionary<string,object>
dictionary.Add("date", date)
foreach( field in json )
{
    dictionary.Add(field.Key, field.Value)
}
list.Add(dictionary);
list = list.GroupBy(m => (DateTime)m["date"], m => "not sure what to do here", (k,d) => (new object[]{k, d.Average()}).ToList()).ToList();

m["date"]也不行。

字典有以下数据:

  1. “关键”数据-“价值” 05/29/2015 05:50:06
  2. “键”处理时间 - “值” 6
  3. “键”磁盘使用情况 - “值” 2

当 中没有更多项目时json,将字典添加到列表中并重复该过程。

标签: c#linqgroup-by

解决方案


根据您的描述,您似乎正在使用字典来表示“字段”/“属性”种类及其值,并且它们连接到每个:

字典包含带有 DateTime 值的键“日期”,以及对应于十进制数字值的各种其他键

如果是这种情况,您最好创建一个自定义类,将这些键中的每一个作为类的不同属性。就像是:

public class YourClass 
{
    public Date DateTime { get; set; }
    public int SomeProperty1 { get; set; }
    public int SomeProperty2 { get; set; }
    // ....
}

一旦你这样做了,而不是有一个List<Dictionary<string,object>>然后有一个List<YourClass>。现在可以很容易地执行您想要的 linq:

我想按日期分组并对每个小数进行平均。

var result = listOfCustomTypes.GroupBy(i => i.DateTime)
                              .Select(g => new YourClass {
                                  Date = g.Key,
                                  SomeProperty1 = g.Average(i => i.SomeProperty1),
                                  SomeProperty2 = g.Average(i => i.SomeProperty2),
                              });

最后,由于您的数据最初是 JSON 格式,您可以:


推荐阅读