【问题标题】:Get "Value" property in IGrouping在 IGrouping 中获取“值”属性
【发布时间】:2011-06-15 19:47:21
【问题描述】:

我有一个类似的数据结构

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,因为我看不到如何实际访问组内的数据记录!

【问题讨论】:

  • 编辑 (Rev2) 不是很有建设性,因为它与任何答案都不匹配。

标签: c# linq data-structures igrouping


【解决方案1】:

对于任何选定的组,您可以调用

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

【讨论】:

  • 谢谢!与 .Select 将再次返回 IGrouping 不同,.SelectMany 将返回分组值类型的 IEnumerable,这正是我所追求的。
  • 我想说只有在(可能)选择了多个组时才使用它。 (又名IEnumerable&lt;IGrouping&lt;key,DespatchGroup&gt;&gt;)。否则,使用toList(),或者直接将其转换为IEnumerable&lt;DespatchGroup&gt;
【解决方案2】:

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

这对很多人来说可能很明显,但希望它会帮助一些人!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 如果我们愿意,我们也可以转换为 IEnumerable:group.AsEnumerable()
    • @MateenUlhaq 虽然这可能有点多余,因为 IGrouping 已经派生自 IEnumerable。它可以在您使用 IEnumerable 的大多数地方工作,而无需任何类型的显式转换/转换。
    【解决方案4】:

    该组实现IEnumerable&lt;T&gt; - 在一般 情况下,只需通过group 调用foreach。在这个的情况下,因为你需要一个List&lt;T&gt;

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

    【讨论】:

    • 所以基本上,如果我们遵循问题的本质,valueToList() 相当,只是将其转换为列表而不是仅仅提取一个值需要更多的开销
    • @CodeBlend 有更多开销,因为他们想要一个列表。如果像他们想象的那样有Values 属性,那么他们将不得不做group.Values.ToList()。相反,如果他们接受任何可枚举而不是列表,那么new DespatchGroup(group.Key, group) 将起作用。开销来自DespachGroup 的定义,而不是来自 IGrouping 的工作方式。
    猜你喜欢
    • 2013-12-03
    • 2012-01-21
    • 2018-05-26
    • 1970-01-01
    • 2016-09-20
    • 2016-03-04
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多