Doubly IGrouping

本文关键字:IGrouping Doubly | 更新日期: 2023-09-27 18:09:25

我的问题是,我试图分组数据两次,并有它在一个单一的集合。第一组按名字分组,第二组按时间每小时分组。最后的集合将是一个项目列表的列表,外部按名称分组,内部按时间分组。

"DataCollection"是一个用于数据序列化的类。

//RawData already defined as List of Items
var groups = new List<IGrouping<string, Item>>();
foreach (IGrouping<string, Item> group in RawData.GroupBy(a => a.Name))
{
    groups.Add(group );
}

上面的代码工作得很好。下面的代码在foreach上运行时中断。

var data = new List<List<ChartDataCollection<Item>>>();
for (var i = 0; i < groups.Count; i++)
{
    data.Add(new List<DataCollection<Item>>());
    foreach (IGrouping<string, Item> hourGroup in groups[i].GroupBy(h => h.Time.Hour))
    {
        data[i].Add(new DataCollection<Item>(hourGroup.ToList<Item>())
        {
            name = hourGroup.Key,
        });
    }
}

我的问题是我是否忽略了一些次要的或接近错误的问题。

Doubly IGrouping

请尝试下面的代码片段,可能对您有所帮助。

var foo = from x in RawData
          group x by x.Name into g
          select
          {
              Name = g.Key
              ItemsByHour =
                  from i in g
                  group i by i.Time.Hour
          };

foreach (IGrouping<string, Item> hourGroup in groups[i].GroupBy(h => h.Time.Hour))

,但Hour似乎很可能是一个数字类型(int或long),而不是string

一个自然的问题是:

为什么编译器没有捕捉到这个?

编译器静默地将枚举数的类型转换为循环变量的声明类型(IGrouping<string, Item>),而不是像在实际声明中那样检查类型。这是由于历史原因。在泛型出现之前,集合通常不是强类型的。c#团队希望在foreach循环中更容易使用这些集合,因此规范中说编译器会为您插入强制转换。从那以后我们就一直活在那个阴影里。在许多情况下,编译器仍然可以捕获错误,因为,例如,您甚至不能尝试将int强制转换为string(这永远不会成功)。然而,这里是一个接口IGrouping<int, Item>到另一个接口IGrouping<string, Item>,它可以在运行时成功。这就是在循环变量声明中使用var的原因。