我正在玩 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 的东西,可以这么说。 (不需要广泛的答案 - 只是谷歌的关键词。)
答案 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创建列表列表。