我正在使用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来创建列表的列表。