Ответ 1
for (int i=0; i < 20 ; i++)
{
var fiveitems = theList.Skip(i*5).Take(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
и сделать множественность, чтобы сделать границы нашего нового набора результатов.
for (int i=0; i < 20 ; i++)
{
var fiveitems = theList.Skip(i*5).Take(5);
}
Похоже, вы хотите, чтобы оператор Batch
из MoreLINQ:
foreach (var batch in query.Batch(5))
{
foreach (var item in batch)
{
...
}
}
Вы также можете сделать это с помощью чистого 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>
...
}
Для такого подхода существует ряд преимуществ, которые не всегда очевидны:
Статический метод расширения
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;
}
Попробуйте следующее:
for (int i = 0; i < list.Count; i = i + 5) {
var fiveitems = list.Skip(i).Take(5);
foreach(var item in fiveitems)
{
}
}