我的问题是,我试图将数据分组两次,并将其放在一个集合中。第一组按名称,第二组每小时按时间分组每个名称组。最后的集合将是一个项目列表,外部按内部时间按名称分组。
"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 );
}上面的代码工作得很好。下面的代码会在运行时中断。
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,
});
}
}我的问题是,我是忽略了一些小问题,还是把问题看错了。提前谢谢。
发布于 2014-06-20 08:50:07
你有
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。
发布于 2014-06-20 06:00:44
请尝试下面的代码片段,可以帮助您。
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
};https://stackoverflow.com/questions/24320790
复制相似问题