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

Kon*_*ten 5 c# linq arrays 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);
}
Run Code Online (Sandbox Code Playgroud)

根据智能感知,我正在生成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);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是两个问题。下面的结果是正确且最窄的范围吗?如果没有,我怎样才能额外收紧呢?

但是,如果是这样,我想知道是否有更好的方法来完成这项任务。我只需要根据星期几(或实际生产中的任何其他条件)将数组中的元素放入不同的容器中。我真的不需要密钥,只是一种将我的一维数组变成二维数组的方法。可以这么说,这与SelectMany相反。(不需要广泛的答案 - 只需一个可以谷歌搜索的关键字。)

D S*_*ley 4

下面的结果是正确且最窄的范围吗?

好吧,IGrouping<TKey,TElement>实施IEnumerable<TElement>这样你就可以这样做:

IEnumerable<IEnumerable<TimeInfo>> grouping =
  = array.GroupBy(element => element.DayOfWeek);
Run Code Online (Sandbox Code Playgroud)

注意数据(包括键值)仍然在具体的数据结构中;您只是将 is 作为集合的集合进行交互。

从那里您可以使用以下方法转换为数组ToArray()

TimeInfo[][] groups = 
   grouping.Select(g => g.ToArray()).ToArray();
Run Code Online (Sandbox Code Playgroud)