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

C# 使用foreach循环和select语句创建多个数组,c#,arrays,C#,Arrays,我有一个数据库,我称之为“选择表中的所有内容”。它有18000多个项目。我有一个方法使用一个web服务,它最多可以向其中传递10个元素的数组。现在,我正在逐项而不是通过数组进行操作。我想创建一个10的数组,然后调用函数。我可以做一个十的数组,然后调用这个函数,我还有三条记录吗 public static void Main() { inventoryBLL inv = new inventoryBLL(); DataSet1.sDataTable dtsku = inv.Sele

我有一个数据库,我称之为“选择表中的所有内容”。它有18000多个项目。我有一个方法使用一个web服务,它最多可以向其中传递10个元素的数组。现在,我正在逐项而不是通过数组进行操作。我想创建一个10的数组,然后调用函数。我可以做一个十的数组,然后调用这个函数,我还有三条记录吗

public static void Main()
{
    inventoryBLL inv = new inventoryBLL();
    DataSet1.sDataTable dtsku = inv.SelectEverything();
    foreach (DataSet1.Row row in dtsku)
    {
        webservicefunction(row.item);
    }
}
我的问题是我将如何改变这一点

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;    
      }
}
publicstaticvoidatatime(此IEnumerable列表,int-eachTime,Action-Action)
{
var=0;
while(list.Count()>=take)
{
操作(list.Skip(taked.Take)(每次));
每次服用+=次;
}
}
用法:

inv.SelectEverything().AtATime<Row>(10, webservicefunction);
inv.SelectEverything().AtATime(10,webservicefunction);
通用扩展方法版本:

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;    
      }
}
publicstaticvoidatatime(此IEnumerable列表,int-eachTime,Action-Action)
{
var=0;
while(list.Count()>=take)
{
操作(list.Skip(taked.Take)(每次));
每次服用+=次;
}
}
用法:

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

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

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

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

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

这真是令人困惑,因为它似乎处于真空中。我不理解你的评论。提供的代码(伪代码?)将包含一个列表,当有项目需要处理时,它将一次向callWebService发送10个项目。这不是你想要的吗?这是可行的,但不是最优的:
skip
需要在每次调用中从头开始,直到到达
take
Count()
需要迭代整个集合是的,很好,但是它很漂亮,OP没有指定任何性能限制。这真的很让人困惑,因为它似乎处于真空状态。我不理解你的评论。提供的代码(伪代码?)将包含一个列表,当有项目需要处理时,它将一次向callWebService发送10个项目。这不是你想要的吗?这是可行的,但不是最优的:
skip
需要在每次调用中从头开始,直到到达
take
Count()
需要迭代整个集合是的,很好,但它很漂亮,OP没有指定任何性能约束。我遇到两个错误1无法将lambda expersion转换为类型“string”,因为它不是委托类型,2不包含“item”的。请提供有关代码的更多详细信息。至少提供
DataSet1.sdatable
DataSet1.Row
类声明和
webservicefunction
的准确签名。否则,很难说您为什么会有这样的错误。我得到两个错误1无法将lambda expersion转换为类型“string”,因为它不是委托类型,2不包含“item”的。请提供有关代码的更多详细信息。至少提供
DataSet1.sdatable
DataSet1.Row
类声明和
webservicefunction
的准确签名。否则很难说你为什么会有这样的错误。