Разделение списков на подсписки с помощью LINQ: подробное руководство

В этой статье блога мы рассмотрим различные методы разделения списка на подсписки с помощью LINQ в C#. Мы рассмотрим различные сценарии и предоставим примеры кода, которые помогут вам понять и реализовать эти методы. Итак, давайте углубимся и научимся профессионально разделять списки!

Метод 1: использование методов Takeи Skip.
Один из самых простых способов разбить список на подсписки — использовать Takeи Skip, предоставляемые LINQ. Метод Takeпозволяет нам извлечь указанное количество элементов из начала списка, а метод Skipпропускает указанное количество элементов из начала списка.

var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var sublistSize = 3;
var sublists = Enumerable.Range(0, (int)Math.Ceiling(numbers.Count / (double)sublistSize))
    .Select(i => numbers.Skip(i * sublistSize).Take(sublistSize))
    .ToList();

Метод 2. Использование метода GroupBy
Метод GroupByLINQ позволяет нам группировать элементы на основе определенного критерия. Мы можем использовать этот метод, чтобы разделить список на подсписки в зависимости от желаемого размера группы.

var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var sublistSize = 3;
var sublists = numbers.Select((number, index) => new { number, index })
    .GroupBy(x => x.index / sublistSize)
    .Select(group => group.Select(x => x.number).ToList())
    .ToList();

Метод 3: использование метода расширения Partition.
Если вы предпочитаете более лаконичный подход, вы можете создать собственный метод расширения под названием Partition, который разбивает список на подсписки. Этот метод инкапсулирует логику и позволяет повторно использовать ее в разных проектах.

public static class EnumerableExtensions
{
    public static IEnumerable<List<T>> Partition<T>(this IEnumerable<T> source, int size)
    {
        var list = new List<T>(size);
        foreach (var item in source)
        {
            list.Add(item);
            if (list.Count == size)
            {
                yield return list;
                list = new List<T>(size);
            }
        }
        if (list.Count > 0)
        {
            yield return list;
        }
    }
}
// Usage:
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var sublistSize = 3;
var sublists = numbers.Partition(sublistSize).ToList();

В этой статье мы рассмотрели несколько методов разделения списка на подсписки с помощью LINQ в C#. Предпочитаете ли вы использовать методы Takeи Skip, метод GroupByили создать собственный метод расширения, например Partition, теперь в вашем распоряжении множество техник. С помощью этих примеров кода и пояснений вы можете уверенно разбивать списки на подсписки в соответствии с вашими конкретными требованиями. Приятного кодирования!