双重组合

时间:2014-06-20 05:55:50

标签: c# .net linq

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

“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,
        });
    }
}

我的问题是我是否忽略了一些小问题或者是否接近错误的问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

请尝试以下代码剪辑,可以帮助您。

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 :(得分:0)

你有

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

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

一个自然的问题是:

  

为什么编译器没有抓住这个?

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

相关问题