Linq: Как сгруппировать по максимальному количеству предметов - PullRequest
7 голосов
/ 11 августа 2009

КОНТЕКСТ

  • У меня есть список предметов (или произвольной длины). Я хотел бы сгруппировать их в «куски» определенного размера
  • Пример: у меня 12 клиентов [0,1,2,3,4,5,6,7,8,9,10,11], и я хочу сгруппировать их по 5, что даст [0,1, 2,3,4] [5,6,7,8,9] [10,11]
  • ПРИМЕЧАНИЕ: на самом деле я не работаю с клиентами или монотонно увеличиваю целые числа. Я выбрал это просто, чтобы упростить задавать вопрос

МОЙ ВОПРОС

Как я могу сформулировать простой запрос LINQ (используя синтаксис запроса), который выполняет эту группировку?

ФОН

  • Я уже знаком с тем, как использовать синтаксис LINQ для группировки по значению, например (для группировки продаж по идентификатору клиента), однако я не знаю, как правильно и элегантно выразить «порцию» с помощью LINQ. Я не уверен, возможно ли это даже прямым способом.
  • Я могу и уже реализовал решение на обычном old-C # без использования синтаксиса LINQ. Таким образом, моя проблема не блокируется по этому вопросу, а скорее я ищу способы выразить это в LINQ (опять же чисто и элегантно)

Ответы [ 4 ]

9 голосов
/ 11 августа 2009

Вы можете сгруппировать их по (index / chunkSize). Пример:

    var result =
        from i in array.Select((value, index) => new { Value = value, Index = index })
        group i.Value by i.Index / chunkSize into g
        select g;
2 голосов
/ 18 июля 2014

Для тех, кто предпочитает методы LINQ (с лямбда-выражениями), вот Ответ Дмитрия Матвеева , преобразованный:

var result = array
    .Select((value, index) => new { Value = value, Index = index })
    .GroupBy(i => i.Index / chunkSize, v => v.Value);

Если вам нужен только массив value вместо IGrouping<T1, T2>, добавьте следующее:

.Select(x => x.ToArray())
0 голосов
/ 26 октября 2016

Метод расширения (используя Ответ Джесси ):

public static IEnumerable<T[]> GroupToChunks<T>(this IEnumerable<T> items, int chunkSize)
{
    if (chunkSize <= 0)
    {
        throw new ArgumentException("Chunk size must be positive.", "chunkSize");
    }

    return
        items.Select((item, index) => new { item, index })
             .GroupBy(pair => pair.index / chunkSize, pair => pair.item)
             .Select(grp => grp.ToArray());
}
0 голосов
/ 28 марта 2016

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

var result = array
.Select((value, index) => new { Value = value, Index = index})
.GroupBy(i => i.Index / chunk, v => v.Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...