在IGrouping中获取"Value"属性

fea*_*net 125 c# linq igrouping data-structures

我有一个类似的数据结构

public DespatchGroup(DateTime despatchDate, List<Products> products);
Run Code Online (Sandbox Code Playgroud)

而我正在努力......

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);
}
Run Code Online (Sandbox Code Playgroud)

我显然不理解,IGrouping因为我无法看到如何实际访问组内的数据记录!

Mar*_*ell 156

该集团实现IEnumerable<T>-在一般情况下,只需拨打foreachgroup.在这种情况下,因为你需要一个List<T>:

list.Add(new DespatchGroup(group.Key, group.ToList());
Run Code Online (Sandbox Code Playgroud)

  • @CodeBlend有更多的开销,因为他们想要一个列表.如果有一个像他们想象的`Values`属性那么他们必须做`group.Values.ToList()`.相反,如果他们接受任何可枚举而不是列表,那么`new DespatchGroup(group.Key,group)`将起作用.开销来自于'DespachGroup`的定义,而不是IGrouping的工作方式. (2认同)

Luk*_*keH 31

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

list.Add(new DespatchGroup(group.Key, group.ToList());
Run Code Online (Sandbox Code Playgroud)

  • 如果我们愿意,我们也可以转换为IEnumerable:`group.AsEnumerable()`. (4认同)

Rob*_*b H 18

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

这对许多人来说可能是显而易见的,但希望它会帮助一些人!


Bas*_*ash 13

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

var selectedGroupValues=selectedGroup.SelectMany(x=>x);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!与将再次返回 IGrouping&lt;&gt; 的 `.Select` 不同,`.SelectMany` 将返回分组值类型的 IEnumerable,这正是我所追求的。 (2认同)