1

セミコロンで区切られた項目を含むテキストの文字列があります。これらのアイテムは、1 つ、2 つ、または数百ある可能性があります。

これらの項目を最大 100 個のバッチで処理する必要があります。配列またはリストを使用できますが、どちらでもかまいません。ただし、LINQ はオプションではありません。

これを行う不格好な方法を思いつくことができますが、効率的でタイトな方法はありますか?

4

2 に答える 2

2

これを使って

public static IEnumerable<IEnumerable<T>> Batch<T>(IEnumerable<T> collection, 
                                                   int batchSize)
{
    List<T> nextbatch = new List<T>(batchSize);
    foreach (T item in collection)
    {
        nextbatch.Add(item);
        if (nextbatch.Count == batchSize)
        {
            yield return nextbatch;
            nextbatch = new List<T>(batchSize);
        }
    }
    if (nextbatch.Count > 0)
        yield return nextbatch;
}

そしてこれを使う

var result = Batch("item1;item2;item3".Split(';'), 100);
于 2012-08-14T20:30:12.040 に答える
0

これらを一度に 100 個以上メモリに保存したくない場合は、次を使用して最初の 100 個の一致をループできますString.Split

string input; //your string
int i;
string[] inputArray; //tring split on semicolon goes here
while(true)
{
    inputArray = input.Split(new char[]{";"}, 101) //only split on first 101 times
    if (inputArray.Count <= 100) //last iteration
    {
        for (i = 0; i < inputArray.Count; i++)
            SendEmail(inputArray[i]);
        break;
    }
    else //will have left over for another loop
    {
        for (i = 0; i < 100; i++)
            SendEmail(inputArray[i]);
        input = inputArray[100];
    }
};

これを最適化する方法があると確信していますが、基本的な考え方 - のcount機能を使用Splitしてそれらすべてを操作しないようにする - が問題を解決する最良の方法かもしれません。

于 2012-08-14T20:31:07.610 に答える