在LINQ中分组时如何显式声明类型



我正在使用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);
}
我的问题是两个。以下是所产生结果的正确和最窄的范围吗?如果不紧,我该如何另外把它紧紧?如果是这样的话,我想知道是否有更好的方法来完成这项任务。我只需要将数组中的元素根据星期中的某一天(或实际生产中的任何其他条件)放入不同的箱子中。我不需要键,我只需要把一维数组变成二维数组的数组。可以说,它类似于SelectMany的对立面。(不需要广泛的答案-只需一个关键字谷歌)

对于所产生的结果,下面是正确的和最窄的范围吗?

好吧,IGrouping<TKey,TElement>实现了IEnumerable<TElement>所以你可以做:

IEnumerable<IEnumerable<TimeInfo>> grouping =
  = array.GroupBy(element => element.DayOfWeek);

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

可以使用ToArray():

转换为数组
TimeInfo[][] groups = 
   grouping.Select(g => g.ToArray()).ToArray();

为了使处理分组的代码更具可读性,我以前就这样做过。经常确保foreach或类属性显式声明igrouing的类型,以便类型清晰。正如这里所介绍的,没有实现IGrouping的具体类型,所以你不能使用更具体的类型,所以我想说,就声明groupby的结果而言,你不能做更多的事情来收紧它:是否可能创建一些IGrouping对象

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

正如Stanley指出的那样,您可以使用Select和ToArray,或者您可以使用ToList来创建列表的列表。

相关内容

  • 没有找到相关文章