C# группировать список, а затем удалять записи с нечетными номерами из групп - PullRequest
1 голос
/ 07 августа 2020

У меня есть список элементов, и я успешно группирую их по идентификатору.

        var groupedItems = items.GroupBy(i => i.ID);

Затем я пытаюсь go по группам, и если в группе нечетное количество элементов, я хотите удалить последний элемент в этой группе. Это не работает.

        groupedItems = groupedItems.Select(
                g => {
                    return (g.Count % 2 == 0) ?
                         g :
                         g.RemoveAt(g.Count - 1);                            
                }
            ).ToList();

Если бы я мог объединить две функции в одну, это было бы еще лучше.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Сделать это можно так:

var groupedItems =
    items.GroupBy(i => i.ID)
         .Select(g => g.Take(g.Count() / 2 * 2))
         .ToList();
1 голос
/ 07 августа 2020

Вы не можете удалять элементы из IGrouping<TKey, TValue>. Это неизменяемая структура данных.

Чтобы исключить последний элемент из нечетных подсчитанных групп, вы можете написать

var groupedItems = from item in items
                   group item by item.ID into byID
                   let odd = byID.Count() % 2 == 0
                   select odd ? byID.SkipLast(1) : byID;

Если вы wi sh, чтобы сохранить ключи, вы можете спроецировать результаты иначе

var groupedItems = from item in items
                   group item by item.ID into byID
                   let odd = byID.Count() % 2 == 0
                   select (id: byID.Key, values: odd ? byID.SkipLast(1) : byID);

И перебирать их так

foreach (var (id, values) in groupedItems) {
    Console.WriteLine($"{id}: {values.ToArray()}");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...