0

Executeのバッチでメソッドを呼び出すにはどうすればよいでしょうrulesObjsか? リストに 10,000 を超えるオブジェクトがありExecute、一度に 500 を超えないように呼び出したいとしましょう。

    public static List<object> ExecutePolicy()
    {
        Policy policy = new Policy();

        List<object> rules = GetRules();

        object[] rulesObjs = rules.ToArray();

        // Call this method with array of object, but in batches.
        policy.Execute(rulesObjs);

        return rulesObjs.ToList();
    }

    private static List<object> GetRules()
    {
        // get the rules via some process
        return new List<object>();
    }
}

public sealed class Policy
{
    public void Execute(params object[] rules)
    {
        // Process rules...
    }
}

私は方法を制御できませんExecute()

4

3 に答える 3

6
List<object> rules = GetRules();
int batchSize = 500;
int currentBatch = 0;

while (currentBatch * batchSize < rules.Count)
{
    object[] nextBatch = rules.Skip(currentBatch * batchSize)
        .Take(batchSize).ToArray();
    //use batch
    currentBatch++;
}
于 2012-09-24T17:06:36.707 に答える
2

メソッドを制御できる場合は、Execute()そのメソッドにインデックスを渡して、配列のどのインデックスから開始するかを認識させるのが最善の方法です。

public void Execute(int startIndex, /*optional*/ int endIndex, params object[] rules)
{
    // Process rules...
}

一度に大量のデータを渡す心配はありません。舞台裏では、配列は単なるポインターであるため、とにかく参照を渡すだけです。


メソッドを制御できない場合は、 Array.CopyExecute()を使用してセクションの新しい配列を作成し、その新しい配列を処理できます。

于 2012-09-24T17:05:07.510 に答える
2

を参照するSystem.Linqと、skip と take を使用できます。

int total = 10000;
int chunkSize = 500;
for (int i = 0; i < total; i += chunkSize )
{
    var chunk = rulesObjs.Skip(i).Take(chunkSize).ToArray();

    policy.Execute(chunk);
}
于 2012-09-24T17:09:44.680 に答える