Обработать список с помощью цикла, каждый раз принимать по 100 элементов и автоматически меньше 100 в конце списка
Есть ли способ использовать цикл, который принимает первые 100 элементов в большом списке, делает что-то с ними, затем следующие 100 и т.д., Но когда он приближается к концу, он автоматически сокращает шаг "100" до оставшихся элементов.
В настоящее время я должен использовать два цикла:
for (int i = 0; i < listLength; i = i + 100)
{
if (i + 100 < listLength)
{
//Does its thing with a bigList.GetRange(i, 100)
}
else
{
//Does the same thing with bigList.GetRange(i, listLength - i)
}
}
Есть ли лучший способ сделать это? Если нет, я, по крайней мере, сделаю "вещь" функцией, поэтому код не нужно копировать дважды.
Ответы
Ответ 1
Вы можете использовать LINQ Skip
и Take
и ваш код будет более чистым.
for (int i = 0; i < listLength; i=i+100)
{
var items = bigList.Skip(i).Take(100);
// Do something with 100 or remaining items
}
Примечание: Если детали меньше чем 100 Take
даст вам оставшиеся из них.
Ответ 2
Вы можете сохранить явную переменную для конечной точки:
for (int i = 0, j; i < listLength; i = j)
{
j = Math.min(listLength, i + 100);
// do your thing with bigList.GetRange(i, j)
}
Ответ 3
List<int> list = null;
int amount_of_hundreds = Math.Floor(list.Count/100);
int remaining_number = list.Count - (amount_of_hundreds * 100);
for(int i = 0; i < amount_of_hundreds; ++i)
{
for(int j = 0; j < 100; ++j)
{
int item = list[(i * 100) + j];
// do what you want with item
}
}
for(int i = 0; i < remaining_number; ++i)
{
int item = list[(amount_of_hundreds * 100) + i];
// do what you want with item
}
Ответ 4
Мне не понравился ни один из перечисленных ответов, поэтому я сделал собственное расширение:
public static class IEnumerableExtensions
{
public static IEnumerable<IEnumerable<T>> MakeGroupsOf<T>(this IEnumerable<T> source, int count)
{
var grouping = new List<T>();
foreach (var item in source)
{
grouping.Add(item);
if(grouping.Count == count)
{
yield return grouping;
grouping = new List<T>();
}
}
if (grouping.Count != 0)
{
yield return grouping;
}
}
}
Тогда вы можете использовать это:
foreach(var group in allItems.MakeGroupsOf(100))
{
// Do something
}
Ответ 5
Вы можете попробовать подход ниже:
int i = 1;
foreach (item x in bigList)
{
batchOperation.Insert(x); //replace it with your action; create the batch
i++;
if (i >100)
{
table.ExecuteBatch(batchOperation); //execute the batch
batchOperation.Clear();
i = 1; // re-initialize
}
}
if (batchOperation.Count >= 1 )
{
table.ExecuteBatch(batchOperation); //do this for the residue items
}