web-dev-qa-db-ja.com

ループでリストを処理し、毎回100個の要素を取得し、リストの最後で自動的に100個未満にします

大きなリストの最初の100個のアイテムを取得し、それらを使用して次の100個のアイテムを処理するループを使用する方法はありますか?.

現在、2つのifループを使用する必要があります。

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)
    }
}

これを行うより良い方法はありますか?そうでない場合は、少なくとも「もの」を関数にして、コードを2回コピーする必要がないようにします。

16
SecondLemon

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は残りのものを提供します。

46
adricadar

エンドポイントの明示的な変数を保持できます。

for (int i = 0, j; i < listLength; i = j)
{
    j = Math.min(listLength, i + 100);
    // do your thing with bigList.GetRange(i, j)
}
4
Ted Hopp
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
    }
1
user3476093

リストされた答えがどれも好きではなかったので、私は自分の拡張機能を作成しました:

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
}
0
Kyle W

以下のアプローチも試すことができます:

        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 
        }
0
nabanita