web-dev-qa-db-ja.com

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>)を取得する方法を誰かが提案できますか?

166
Illia Ratkevych

IGrouping<TKey, TElement>IEnumerable<TElement>を実装しているので、SelectManyを使用して、すべてのIEnumerablesを1つの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();
243
Matt Smith
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

まずあなたが希望するグループを選択する必要があります。その後、そのグループでToListメソッドを使用できます。 IGroupingは、値のIEnumerableです。

29
Tim Cools

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
}
14
user1275513

上記の回答のより明確なバージョン:

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