Как получить значения из 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> в таком контексте?

Ответ 1

Так как 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();

Ответ 2

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

Сначала вам нужно выбрать нужную группу. Затем вы можете использовать метод ToList в группе. IGrouping - это IEnumerable значений.

Ответ 3

Из определения 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
}

Ответ 4

Более подробная версия приведенных выше ответов:

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

Ответ 5

Вы также можете использовать следующий код.

var groupedData = Data.GroupBy(x => x.Period).Select(x => x).ToList();

foreach (var group in groupedData) {
    var gr = group.FirstOrDefault();
    Console.WriteLine("Period: {0}", gr.Period);
    Console.WriteLine("Adjustment: {0}", gr.Adjustment);
}