我有一个关于分组和Select()方法的问题。

假设我有一个IEnumerable<IGrouping<int, smth>>,如下所示:

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

其中list是list <smth>。

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

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

有人能建议如何从IGrouping<int, smth>在这样的上下文中获得值(List<smth>)吗?


当前回答

根据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
}

其他回答

以上答案的更明确版本:

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;
    }
}

根据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
}

因为IGrouping<TKey, TElement>实现了IEnumerable<TElement>,你可以使用SelectMany把所有的IEnumerable一起放回一个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();

下面是一个构建/运行的示例:https://dotnetfiddle.net/DyuaaP

解决方案视频解说:https://youtu.be/6BsU1n1KTdo

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

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

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

有人能建议如何从IGrouping<int, smth>在这样的上下文中获得值(列表)吗?

"IGrouping<int, smth> group"实际上是一个带键的IEnumerable,所以你要么:

迭代组或 使用group.ToList()将其转换为List

foreach (IGrouping<int, smth> group in groups)
{
   var thisIsYourGroupKey = group.Key; 
   List<smth> list = group.ToList();     // or use directly group.foreach
}