使用yield在每组中循环

时间:2013-11-13 08:15:16

标签: c# arrays loops yield

我有.ToArray()字符串,想要在每个10个项目组中处理该列表。 我很确定在这种情况下我可以使用yield但不知道如何使用。

我希望循环遍历100项.ToArray()并想要每组10个项目并进行处理。

以下是我的代码,但不确定如何使用yield对每个10项进行分组。

caseNumberList is string .ToArray()

 foreach (string commaString in ProcessGroup(caseNumberList, 10))
                            {
                                Console.Write(commaString); // 10 comma seperated items.
                                Console.Write(" ");
                            }

 public static IEnumerable<string> ProcessGroup(Array[] number, int limit)
        {
            int itemNum = 0;
            string caseNumbers = string.Empty;
            //
            // Continue loop until the exponent count is reached.
            //
            while (itemNum< limit)
            {
                caseNumbers = caseNumbers + number[itemNum];
                yield return caseNumbers;
            }
        }

请建议。

3 个答案:

答案 0 :(得分:7)

您可以使用下面的扩展方法:

public static IEnumerable<List<T>> Batch<T>(this IEnumerable<T> list, int size)
{
    List<T> batch = new List<T>(size);
    foreach(var item in list)
    {
       batch.Add(item);
       if (batch.Count >= size)
       {
         yield return batch;
         batch = new List<T>(size);
       }
    }

    if (batch.Count > 0)
      yield return batch;
}

样本用法:

 foreach(var group in Enumerable.Range(1,32).Batch(10)) { .. }

答案 1 :(得分:1)

虽然我更喜欢@HansKestings的回答,但只需稍微修改一下代码就可以达到你想要的效果:

for(int i = 0; i < caseNumberList.Length; i+=10) {
    foreach (string commaString in ProcessGroup(caseNumberList, i, 10))
    {
        Console.Write(commaString);
        Console.Write(",");
    }

    Console.Write("\r\n");
}

static IEnumerable ProcessGroup(int[] number, int startindex, int limit)
{
    int itemNum = startindex;
    int iterations = 0;
    string caseNumbers = string.Empty;
    //
    // Continue loop until the exponent count is reached.
    //
    while (iterations < limit)
    {
        caseNumbers = caseNumbers + number[itemNum];
        itemNum++;
        iterations++;
        yield return caseNumbers;
    }
} 

添加了另一个for - 循环来跟踪数组索引并更改ProcessGroup以接受一个整数:它应该从哪里开始的数组索引。
您可能希望将硬编码的10放入变量。

答案 2 :(得分:0)

试试这段代码,

var howMuch = 10;

var count = caseNumberList.Count();
int times = count/howMuch;

var listOfLists = new List<IEnumerable<string>>();
for (int i = 0; i < times; i++)
{
    listOfLists.Add(caseNumberList.Skip(howMuch * i).Take(howMuch));
}


foreach (var tenElementArray in listOfLists)
{
     //... do the logic
}