Как разделить список на основе индекса в C#?
У меня есть список с примерно 190 элементами в нем на данный момент. Как я могу разделить список на меньшие списки с максимальным количеством элементов 50 в каждом списке?
результатом могут быть списки из 50, 50, 50 и 40 элементов.
4 ответов
предполагая, что вы имеете в виду List<T>
можно использовать GetRange
неоднократно способ. Черт возьми, вы можете сделать это с LINQ:
var lists = Enumerable.Range(0, (list.Count + size - 1) / size)
.Select(index => list.GetRange(index * size,
Math.Min(size, list.Count - index * size)))
.ToList();
или вы можете просто использовать цикл, конечно:
public static List<List<T>> Split(List<T> source, int size)
{
// TODO: Prepopulate with the right capacity
List<List<T>> ret = new List<List<T>>();
for (int i = 0; i < source.Count; i += size)
{
ret.Add(source.GetRange(i, Math.Min(size, source.Count - i)));
}
return ret;
}
это несколько более эффективно, чем использование GroupBy
, хотя это ограничивается List<T>
в качестве входных данных.
у нас есть другая реализация с помощью IEnumerable<T>
на MoreLINQ на пакета.cs.
вы можете использовать LINQ:
var list = Enumerable.Range(1, 190);
var sublists = list
.Select((x, i) => new { Index = i, Value = x })
.GroupBy(x => x.Index / 50)
.Select(x => x.Select(v => v.Value).ToList())
.ToArray();
Я попытался рекурсивный подход. Просто посмотреть, как это будет выглядеть.
List<List<T>> SplitIntoChunks<T>(IEnumerable<T> originalList, int chunkSize)
{
if(originalList.Take(1).Count() == 0)
{
return new List<List<T>>();
}
var chunks = new List<List<T>> {originalList.Take(chunkSize).ToList()};
chunks.AddRange(SplitIntoChunks(originalList.Skip(chunkSize), chunkSize));
return chunks;
}
var list = new List<int>(Enumerable.Range(1,190));
var page_size = 50;
var max_pages = 1 + list.Count() / page_size;
for(int page = 1; page <= max_pages; page++) {
var chunk = list.Skip(page_size * (page-1)).Take(page_size);
// do whatever
}