如何从IGrouping中获取值

时间:2011-12-15 13:43:11

标签: c# linq select igrouping

我有关于IGrouping和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(...); // <- ???
}

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

7 个答案:

答案 0 :(得分:240)

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();

答案 1 :(得分:28)

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

首先,您需要选择所需的组。然后,您可以使用组中的ToList方法。 IGroupingIEnumerable的值。

答案 2 :(得分:13)

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

答案 3 :(得分:10)

More clarified version of above answers:

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

答案 4 :(得分:2)

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

在这种情况下,有人可以建议如何从IGrouping 获取值(列表)吗?

“ IGrouping 组”实际上是带有密钥的IEnumerable,因此您可以:

  • 在组中重复或
  • 使用group.ToList()将其转换为列表
foreach (IGrouping<int, smth> group in groups)
{
   var thisIsYourGroupKey = group.Key; 
   List<smth> list = group.ToList();     // or use directly group.foreach
}

答案 5 :(得分:0)

只需这样做:

// 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) 生成“列表列表”,有点像。

答案 6 :(得分:-1)

假设您有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();