使用foreach循环和select语句创建多个数组

本文关键字:创建 数组 语句 select foreach 循环 使用 | 更新日期: 2023-09-27 18:07:02

我有一个数据库,我调用它来选择表中的所有内容。它有18000多个项目。我有一个方法,它使用一个web服务,可以将一个最多10个元素的数组传递到其中。现在我正在逐项而不是逐数组进行。我想创建一个10的数组,然后调用函数。我可以做一个10的数组,然后调用函数。如果我有额外的三条记录,那是什么?

public static void Main()
{
    inventoryBLL inv = new inventoryBLL();
    DataSet1.sDataTable dtsku = inv.SelectEverything();
    foreach (DataSet1.Row row in dtsku)
    {
        webservicefunction(row.item);
    }
}

我的问题是我该如何改变它?

使用foreach循环和select语句创建多个数组

问题的通用解决方案可能如下所示:

static class LinqHelper
{
    public static IEnumerable<T[]> SplitIntoGroups<T>(this IEnumerable<T> items, int N)
    {
        if (items == null || N < 1)
            yield break;
        T[] group = new T[N];
        int size = 0;
        var iter = items.GetEnumerator();
        while (iter.MoveNext())
        {
            group[size++] = iter.Current;
            if (size == N)
            {
                yield return group;
                size = 0;
                group = new T[N];
            }
        }
        if (size > 0)
            yield return group.Take(size).ToArray();
    }
}

所以你的Main函数变成

public static void Main()
{
    inventoryBLL inv = new inventoryBLL();
    DataSet1.sDataTable dtsku = inv.SelectEverything();
    foreach (var items in dtsku.Select(r => r.item).SplitIntoGroups(10))
    {
        webservicefunction(items);
    }
}
var taken = 0;
var takecount = 10;
while(list.Count() >= taken)
{
     callWebService(list.Skip(taken).Take(takecount));
     taken += takecount;
}

通用扩展方法版本:

public static void AtATime<T>(this IEnumerable<T> list, int eachTime, Action<IEnumerable<T>> action)
{
      var taken = 0;
      while(list.Count() >= taken)
      {
           action(list.Skip(taken).Take(eachTime));
           taken += eachTime;    
      }
}

用法:

inv.SelectEverything().AtATime<Row>(10, webservicefunction);