如何在LINQ中进行分组时明确说明类型?

时间:2015-06-08 19:42:03

标签: c# arrays linq group-by

我正在玩 GroupBy(...),我意识到,虽然有效,但我不想使用 var 。叫我肛门,但我想知道我拥有它时的类型。 (当然,我不是一个理论家,当语法使眼睛流血时,我会使用 var 。但是,知道如何将其显式化很好,应该敦促涌现。)

var grouping = array.GroupBy(element => element.DayOfWeek);
foreach (var group in grouping)
{
  Console.WriteLine("Group " + group.Key);
  foreach (var value in group)
    Console.WriteLine(value.Start);
}

根据智能感知,我生成了 IGrouping 类型的东西但是当我试图明确地输入它时,发生了奇怪的事情。我已经到了以下地方。

IEnumerable<IGrouping<DayOfWeek, TimeInfo>> grouping 
  = array.GroupBy(element => element.DayOfWeek);
foreach (IGrouping<DayOfWeek, TimeInfo> group in grouping)
{
  Console.WriteLine("Group " + group.Key);
  foreach (TimeInfo value in group)
    Console.WriteLine(value.Start);
}

我的问题是twosome。以下是生成结果的正确和最窄范围吗?如果没有,我怎么能另外加紧?

如果是这样的话,我想知道是否有更好的方法来完成任务。我只需要将数组中的元素放入不同的日期(相对于星期几)(或实际生产中的任何其他条件)。我并不真正需要密钥,只是将我的一维数组转换为二维数组阵列的方法。类似于 SelectMany 的东西,可以这么说。 (不需要广泛的答案 - 只是谷歌的关键词。)

2 个答案:

答案 0 :(得分:4)

  

以下是产生结果的正确且最窄的范围吗?

好吧,Pattern pattern = Pattern.compile("(?<=\\d\\s)\\d{2}(?=\\s\\d)"); Matcher m = pattern.matcher(line); while (m.find()) { value = Integer.parseInt(m.group().trim()); } line = line.replaceAll("(?<=\\d\\s)\\d{2}(?=\\s\\d)", "").replaceAll(" +", " "); System.out.println(line); 实施了IGrouping<TKey,TElement>,所以你可以做:

IEnumerable<TElement>

请注意,数据(包括键值)仍然在具体的数据结构中;你只是作为一个集合的集合接口。

从那里你可以使用IEnumerable<IEnumerable<TimeInfo>> grouping = = array.GroupBy(element => element.DayOfWeek);

转换为数组
ToArray()

答案 1 :(得分:1)

之前我已经完成了这项工作,以使代码更易于处理分组。通常确保foreach或类属性明确声明IGrouping的类型,因此类型是明确的。如此处所述,没有实现IGrouping的具体类型,因此没有什么更具体的可以使用,所以我要说声明groupby的结果,没有什么可以做的就是收紧它:{ {3}}

你也可以使用ToDictionary来创建许多开发人员更熟悉的东西,但每个值实际上都是一个列表,这可能有点奇怪。

正如斯坦利所指出的,您可以使用选择ToArray,或者您可以使用ToList创建列表列表。