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,
});
}
}
我的问题是我是否忽略了一些次要的或接近错误的问题。
请尝试下面的代码片段,可能对您有所帮助。
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
的原因。