我有.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;
}
}
请建议。
答案 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
}