在IGrouping中获取“值”属性


141

我有一个像这样的数据结构

public DespatchGroup(DateTime despatchDate, List<Products> products);

我正在努力做...

var list = new List<DespatchGroup>();

foreach (var group in dc.GetDespatchedProducts().GroupBy(i => i.DespatchDate))
{
    // group.Values is not correct... how do I write this?
    list.Add(new DespatchGroup(group.Key, group.Values);
}

我显然不明白,IGrouping因为我看不到如何实际访问组中的数据记录!


1
编辑(Rev2)不太有建设性,因为它与任何答案都不匹配。
Sunny Patel

Answers:


170

该集团执行IEnumerable<T>-在一般情况下,只需拨打foreachgroup。在这种情况下,由于您需要List<T>

list.Add(new DespatchGroup(group.Key, group.ToList());

因此,基本上,如果我们遵循该问题的实质,value就相当于ToList()只有更多的开销将其转换为列表,而不是仅仅提取一个值
Coops 2014年

2
@CodeBlend有更多的开销,因为他们想要一个列表。如果有Values他们想像的财产,那他们就得做group.Values.ToList()。相反,如果他们接受任何可枚举的名称而不是列表,则new DespatchGroup(group.Key, group)可以使用。开销来自于定义,DespachGroup而不是来自IGrouping的工作方式。
乔恩·汉娜

35

没有Values属性或类似属性,因为它IGrouping<T>本身就是IEnumerable<T>值的序列。在这种情况下,您需要做的就是将该序列转换为列表:

list.Add(new DespatchGroup(group.Key, group.ToList());

6
如果需要,我们也可以转换为IEnumerable group.AsEnumerable()
Mateen Ulhaq '16

22

对于任何选定的组,您可以致电

var selectedGroupValues=selectedGroup.SelectMany(x=>x);

2
谢谢!与之不同的是.Select,它将再次返回IGrouping <>,.SelectMany将返回分组值类型的IEnumerable,这正是我所追求的。
K0D4 '18年

我要说的是仅在(可能)选择多个组时使用此功能。(又名IEnumerable<IGrouping<key,DespatchGroup>>)。否则,请使用toList()或直接将其转换为IEnumerable<DespatchGroup>
苹果苹果

21

只是一个相关提示-正如其他答案所说,分组是IEnumerable,如果需要访问特定的索引,则可以使用group.ElementAt(i)

这对很多人来说可能是显而易见的,但希望对少数人有帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.