セミコロンで区切られた項目を含むテキストの文字列があります。これらのアイテムは、1 つ、2 つ、または数百ある可能性があります。
これらの項目を最大 100 個のバッチで処理する必要があります。配列またはリストを使用できますが、どちらでもかまいません。ただし、LINQ はオプションではありません。
これを行う不格好な方法を思いつくことができますが、効率的でタイトな方法はありますか?
これを使って
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);
これらを一度に 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
してそれらすべてを操作しないようにする - が問題を解決する最良の方法かもしれません。