我有一串文本,其中的项目用分号分隔。可能有一个、几个或数百个这样的项目。
我需要分批处理这些项目,最多 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
来避免与它们一起工作 - 可能是解决问题的最佳方法。