如何从IGrouping获取值

问题描述 投票:187回答:4

我对IGrouping和Select()方法有疑问。

让我说我已经以这种方式获得IEnumerable<IGrouping<int, smth>>

var groups = list.GroupBy(x => x.ID);

列表是List<smth>

现在我需要以某种方式将每个IGrouping的值传递给另一个列表。:

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}

有人可以建议在这种情况下如何从List<smth>获取值(IGrouping<int, smth>吗?

c# linq select igrouping
4个回答
262
投票

由于IGrouping<TKey, TElement>实现了IEnumerable<TElement>,因此您可以使用SelectMany将所有IEnumerables全部放回到一个IEnumerable中:

List<smth> list = new List<smth>();
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id);
IEnumerable<smth> smths = groups.SelectMany(group => group);
List<smth> newList = smths.ToList();

30
投票
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

首先,您需要选择所需的组。然后,您可以在组上使用ToList方法。 IGrouping是值的IEnumerable


15
投票

根据IGrouping的定义:

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable

您可以仅遍历这样的元素:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID)
foreach(IEnumerable<smth> element in groups)
{
//do something
}

13
投票

以上答案的更多澄清版本:

IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA);

foreach (var groupingByClassA in groups)
{
    int propertyIntOfClassA = groupingByClassA.Key;

    //iterating through values
    foreach (var classA in groupingByClassA)
    {
        int key = classA.PropertyIntOfClassA;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.