首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双IGrouping

双IGrouping
EN

Stack Overflow用户
提问于 2014-06-20 05:55:49
回答 2查看 101关注 0票数 0

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

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

代码语言:javascript
复制
//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 );
}

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

代码语言:javascript
复制
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,
        });
    }
}

我的问题是,我是忽略了一些小问题,还是把问题看错了。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-20 08:50:07

你有

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2014-06-20 06:00:44

请尝试下面的代码片段,可以帮助您。

代码语言:javascript
复制
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
          };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24320790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档