Обработать список с помощью цикла, каждый раз принимать по 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 
        }