Если у вас есть коллекция предметов
var items = Enumerable.Range(1, 20);
И вы хотите взять, скажем, 5 за раз
var setSize = 5;
Вы можете перебирать коллекцию по индексу, ивозьмите эти 5 за один раз в виде списка и поместите все эти 5 списков в один внешний список
Enumerable.Range(0, items.Count() - setSize).Select(x => items.Skip(x).Take(setSize).ToList()).ToList()
Результат (из интерактивной оболочки C #) выглядит как
List<List<int>>(15) {
List<int>(5) { 1, 2, 3, 4, 5 },
List<int>(5) { 2, 3, 4, 5, 6 },
List<int>(5) { 3, 4, 5, 6, 7 },
List<int>(5) { 4, 5, 6, 7, 8 },
List<int>(5) { 5, 6, 7, 8, 9 },
List<int>(5) { 6, 7, 8, 9, 10 },
List<int>(5) { 7, 8, 9, 10, 11 },
List<int>(5) { 8, 9, 10, 11, 12 },
List<int>(5) { 9, 10, 11, 12, 13 },
List<int>(5) { 10, 11, 12, 13, 14 },
List<int>(5) { 11, 12, 13, 14, 15 },
List<int>(5) { 12, 13, 14, 15, 16 },
List<int>(5) { 13, 14, 15, 16, 17 },
List<int>(5) { 14, 15, 16, 17, 18 },
List<int>(5) { 15, 16, 17, 18, 19 }
}
Если вы хотите, чтобы каждый элемент отображался только один раз в каждом списке, вы можете изменить вышеуказанное. Предположим, есть нечетное количество элементов:
var items = Enumerable.Range(1, 11);
Вы хотите изменить начальный диапазон, используемый для индексации в вашей коллекции. Вместо того, чтобы брать по 5 за каждый индекс, он будет увеличивать индекс на 5 за каждую итерацию. Единственная сложная часть заключается в том, чтобы обрабатывать, когда коллекция делит количество элементов, которые вы хотите взять;Вы не хотите заканчивать с пустым списком в конце. То есть это неверно:
Enumerable.Range(0, items.Count() / setSize).Select( // don't do this
Тогда оператор выглядит так:
Enumerable.Range(0, ((items.Count() - 1) / setSize) + 1).Select(x => items.Skip(setSize * x).Take(setSize).ToList()).ToList();
Результат (из интерактивной оболочки C #) выглядит как
List<List<int>>(3) {
List<int>(5) { 1, 2, 3, 4, 5 },
List<int>(5) { 6, 7, 8, 9, 10 },
List<int>(1) { 11 }
}