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

时间:2011-08-29 20:22:29

标签: c# arrays

我有一个数据库,我调用它选择表的所有内容。它有18000多个项目。我有一个方法使用一个Web服务,可以有一个最多十个元素的数组传入它。现在我逐项而不是数组。我想创建一个十的数组然后调用该函数。我可以创建一个十个数组,然后调用函数是什么,我有额外的三个记录?

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

我的问题是如何改变这个?

2 个答案:

答案 0 :(得分:1)

您的问题的一般解决方案可能如下所示:

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);
    }
}

答案 1 :(得分:0)

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);