C# 在LINQ中分组时,如何显式声明类型?

C# 在LINQ中分组时,如何显式声明类型?,c#,arrays,linq,group-by,C#,Arrays,Linq,Group By,我正在和GroupBy(…)玩,我意识到,虽然我在工作,但我不喜欢使用var。叫我anal,但我想知道我有什么类型的var。(当然,我不是一个理论家,当语法让人眼花缭乱时,我会使用var。不过,知道如何解释它还是很好的,如果有人出现的话。) 根据intellisense,我正在生成某种类型的IGrouping,但当我试图显式输入时,奇怪的事情发生了。我已达成以下协议 IEnumerable<IGrouping<DayOfWeek, TimeInfo>> grouping

我正在和GroupBy(…)玩,我意识到,虽然我在工作,但我不喜欢使用var。叫我anal,但我想知道我有什么类型的var。(当然,我不是一个理论家,当语法让人眼花缭乱时,我会使用var。不过,知道如何解释它还是很好的,如果有人出现的话。)

根据intellisense,我正在生成某种类型的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);
}
IEnumerable分组
=数组.GroupBy(element=>element.DayOfWeek);
foreach(分组中的I分组组)
{
Console.WriteLine(“组”+组键);
foreach(组中的TimeInfo值)
Console.WriteLine(value.Start);
}
我的问题有两个。以下是生成结果的正确且最窄的范围吗?如果没有,我怎样才能额外收紧它

如果是这样的话,我想知道是否有更好的方法来完成这项任务。我只需要根据星期几(或实际生产中的任何其他条件)将阵列中的元素放入不同的容器中。我真的不需要钥匙,只是一种将一维数组转换成二维数组的方法。可以说,它是SelectMany的反面。(不需要详细的回答——只需一个关键字就可以用谷歌搜索了。)

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

嗯,
i分组
实现了
IEnumerable
,因此您可以:


我以前确实做过这样的工作,以使处理分组的代码更具可读性。通常要确保
foreach
或class属性明确地声明了iGroup的类型,以便类型清晰。如本文所述,没有实现IGrouping的具体类型,因此您无法使用更多的具体类型,因此我要说的是,就声明groupby的结果而言,您无法对其进行严格限制:

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

正如Stanley指出的那样,你可以使用Select和ToArray,也可以使用ToList创建列表。

@adv它被认为是贬义的,因为仅仅因为某些半宗教信仰而以某种方式编程通常会适得其反。尽管如此,我们还是保留你的版本吧,因为我不想激起不好的情绪。有更适合这样做的地方。:)
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);
}
IEnumerable<IEnumerable<TimeInfo>> grouping =
  = array.GroupBy(element => element.DayOfWeek);
TimeInfo[][] groups = 
   grouping.Select(g => g.ToArray()).ToArray();