1

我有一串文本,其中的项目用分号分隔。可能有一个、几个或数百个这样的项目。

我需要分批处理这些项目,最多 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 回答