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>
)を取得する方法を誰かが提案できますか?
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();
foreach (var v in structure)
{
var group = groups.Single(g => g.Key == v. ??? );
v.ListOfSmth = group.ToList();
}
まずあなたが希望するグループを選択する必要があります。その後、そのグループでToList
メソッドを使用できます。 IGrouping
は、値のIEnumerable
です。
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;
}
}