260

我有一个关于方法IGrouping的问题Select()

假设我有IEnumerable<IGrouping<int, smth>>这种方式:

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

哪里listList<smth>

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

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

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

4

7 回答 7

329

由于IGrouping<TKey, TElement>implements 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();

这是构建/运行的示例:https ://dotnetfiddle.net/DyuaaP

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

于 2011-12-15T13:56:12.710 回答
43
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

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

于 2011-12-15T13:52:47.627 回答
25

上述答案的更清晰版本:

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;
    }
}
于 2015-05-24T21:16:35.967 回答
18

从 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
}
于 2013-08-21T14:09:46.633 回答
8
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
}
于 2020-10-07T19:53:56.937 回答
-1

只需这样做:

// this will "split" the list into groups
var groups = list.GroupBy(x => x.ID);

// groups is a "collection of lists"
foreach (var sublist in groups)
{
  // now the sublist is only a part of the original list
  // to get which is the value of ID, you can use sublist.Key
}

您不需要Select().GroupBy(expr)制作“列表列表”,有点。

于 2021-07-29T12:10:21.313 回答
-2

假设您有 MyPayments 类

 public class Mypayment
{
    public int year { get; set; }
    public string month { get; set; }
    public string price { get; set; }
    public bool ispaid { get; set; }
}

你有一个 MyPayments 列表

public List<Mypayment> mypayments { get; set; }

并且您希望按年份对列表进行分组。您可以像这样使用 linq:

List<List<Mypayment>> mypayments = (from IGrouping<int, Mypayment> item in yearGroup
                                                let mypayments1 = (from _payment in UserProjects.mypayments
                                                                   where _payment.year == item.Key
                                                                   select _payment).ToList()
                                                select mypayments1).ToList();
于 2020-10-08T07:35:17.003 回答