Как получить значения из IGrouping

у меня есть вопрос о IGrouping и Select() метод.

допустим, у меня есть IEnumerable<IGrouping<int, smth>> таким образом:

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

где список-это List<smth>.

и теперь мне нужно передать значения каждого IGrouping в другой список каким-то образом.:

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

может ли кто-нибудь предложить, как получить значения (List<smth>) от IGrouping<int, smth> в таком контексте?

4 ответов


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

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

сначала вам нужно выбрать нужную группу. Тогда вы можете использовать ToList метод on группы. The 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;
    }
}