如何从IGrouping中获取值

Ill*_*ych 184 c# linq select igrouping

我有关于IGrouping和Select()方法的问题.

让我说我有IEnumerable<IGrouping<int, smth>>这样的方式:

var groups = list.GroupBy(x => x.ID);
Run Code Online (Sandbox Code Playgroud)

列表是一个List<smth>.

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

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何List<smth>IGrouping<int, smth>这样的上下文中获取values()吗?

Mat*_*ith 260

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

  • 是不是和普通的"orderBy"相同?List <smth> newList = list .OrderBy(x => x.id).ToList(); (3认同)
  • @MorgoZ,`OrderBy(x => x.id)`将按ID按升序对它们进行排序.将其与`.GroupBy(x => x.id).SelectMany(group => group)`进行对比,它将按ID的首次出现顺序对它们进行排序.如果原始ID的顺序为:[1,3,2,2,2,3,0],则将它们分组然后展平为一个列表将使ID按新顺序排列:[1,3,3, 2,2,2,0]. (3认同)
  • 它对我不起作用..它说不能通过用法推断出类型 (3认同)
  • 类型不能通过用法来推断 (3认同)
  • @zcoop98,不。那是行不通的。这将为您提供每个组中的第一个元素,这不是所需的结果:https://dotnetfiddle.net/sXwnGM (2认同)

Tim*_*ols 30

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

首先,您需要选择所需的组.然后你可以使用ToList组上的方法.这IGrouping是一个IEnumerable价值观.


use*_*513 15

从IGrouping的定义:

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
Run Code Online (Sandbox Code Playgroud)

你可以迭代这样的元素:

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

  • 哦,我的错误,那么:'foreach (smth p in groups.SelectMany(sth =&gt; sth))' (3认同)
  • 遍历他的组而不是组中的项目 (2认同)

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


小智 6

var groups = list.GroupBy(x => x.ID);
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何在这种情况下从 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
}
Run Code Online (Sandbox Code Playgroud)