开发者

Creating multiple array using a foreach loop and a select statement

I have a database that I call select all of its contents of a table. It has 18000+ items. I have a method uses a web service that can have an array of up to ten element pass into it. Right now I am doing item by item instead of by an array. I want to create an array of ten and then call the function. I could make an array of ten and then call the functio开发者_运维问答n be what is I have an extra three records?

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

My question is how would I transform this?


Generic solution of your problem could look like this:

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

So your Main function become

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

Generic Extension Method version:

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

Usage:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜