2011-08-29 52 views
1

我有一個數據庫,我打電話選擇它的表中的所有內容。它有18000+項目。我有一個方法使用一個Web服務,它可以有一個最多10個元素的數組傳入它。現在我正在逐項而不是數組。我想創建一個十的數組,然後調用該函數。我可以創建一個十個數組,然後調用函數是什麼我有一個額外的三個記錄?使用foreach循環和選擇語句創建多個數組

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

我的問題是我將如何改變這一點?

回答

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

我得到兩個錯誤1無法將lambda擴展轉換爲鍵入'string',因爲它不是委託類型,2不包含'item'。 –

+0

請詳細瞭解您的代碼。至少要提供'DataSet1.sDataTable'和'DataSet1.Row'類聲明和'webservicefunction'的確切簽名。否則很難說爲什麼你有這樣的錯誤。 –

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

這真是令人困惑,因爲它看起來真空。 –

+0

我不明白你的評論。提供的代碼(僞代碼?)將會列出​​一個列表,當有項目需要處理時,它會一次發送10個代碼來調用WebService。這不是你想要的嗎? – rtalbot

+0

這可以解決,但不是最優的:'skip'需要從每次調用的開始處開始,直到達到'被採用'。 – Magnus