Подтвердить что ты не робот

Linq Выберите 5 элементов за итерацию

Linq Выбирайте по 5 элементов каждый раз на основе нашего счетчика

Наш список, например "theList", имеет 100 элементов, Хотите просмотреть список и Выбрать 5 элементов в каждой итерации,

Пример кода, который мы хотим изменить в наш желаемый результат:

        theList = dt.AsEnumerable()
            .Select(row => new CustItem
            {
                Name = row.Field<string>("tName"),
                Title = row.Field<string>("tTitle"),
            }).ToList();

Мы должны переустанавливать его в цикле и обрабатывать по выбранным 5 элементам каждый раз или передавать его другим методам:

что-то вроде этого:

for (int i=0; i < 20 ; i++)

Я хочу использовать перечислитель "i" в инструкции linq select и сделать множественность, чтобы сделать границы нашего нового набора результатов.

4b9b3361

Ответ 1

for (int i=0; i < 20 ; i++)
{
    var fiveitems = theList.Skip(i*5).Take(5);
}

Ответ 2

Похоже, вы хотите, чтобы оператор Batch из MoreLINQ:

foreach (var batch in query.Batch(5))
{
    foreach (var item in batch)
    {
        ...
    } 
}

Ответ 3

Вы также можете сделать это с помощью чистого linq, используя преимущества целочисленной арифметики и метода GroupBy:

int blockSize = 5;
var group = theList.Select((x, index) => new { x, index })
                   .GroupBy(x => x.index / blockSize, y => y.x);

foreach (var block in group)
{
    // "block" will be an instance of IEnumerable<T>
    ...
}

Для такого подхода существует ряд преимуществ, которые не всегда очевидны:

  • Выполнение отложено, поэтому оно эффективно, когда вы работаете с условной обработкой
  • Вам не нужно знать длину коллекции, тем самым избегая множественного перечисления, а также в целом более чистого, чем другие подходы.

Ответ 4

Статический метод расширения

public static List<IEnumerable<T>> Batch<T>(this IEnumerable<T> items, int qtyPerBatch) 
{       
    decimal iterations = items.Length / qtyPerBatch;        
    var roundedIterations = (int)Math.Ceiling(iterations);
    var batchItems = new List<IEnumerable<T>>();
    for (int i = 0; i < roundedIterations; i++)
    {       
        batchItems.Add(items.Skip(i * qtyPerBatch).Take(qtyPerBatch).ToArray());        
    }
    return batchItems;      
}

Ответ 5

Попробуйте следующее:

 for (int i = 0; i < list.Count; i = i + 5) {
                var fiveitems = list.Skip(i).Take(5);
                foreach(var item in fiveitems)
                {

                }
            }