2015-11-17 47 views
3

假設我在列表中有23個元素。我怎樣才能做到每次取5個元素,最後一次取3個元素?有什麼像「takeN」方法,我可以用foreach或什麼東西?用takeN元素代替1的foreach

// myList is a list 23 elements 
foreach (var x in myList) { 
    // x is a list with 5 elements 
} 

回答

4

有沒有在框架的,但是你可以使用MoreLINQBatch方法:(。在最後一次迭代,這將只有3個單元)

foreach (var sublist in myList.Batch(5)) 
{ 
    // sublist has up to 5 elements 
} 

+0

但是,使用外部庫只是一個簡單的擴展方法?我寧願實施我自己的'批'。 – SimpleVar

+0

@SimpleVar:需要更少的時間來獲取依賴項,而不是實現它*並自己測試它 - 以及爲什麼假設這是您要使用的唯一的東西? –

+0

@JonathanCarroll:不,這不是它的工作原理。它的工作原理是鏈接到我的帖子中的'Batch',它鏈接到實際的源代碼。 –

0

你可以使用正常循環:

for(int i = 0; i < myList.Count; i += 5) { .. } 
+0

這可能是一個評論沒有答案 –

1

未經測試,但類似如下:

 for (int i = 0; i < myList.Count; i += 5) 
     { 
      var sublist = myList.Skip(i).Take(5); 
     } 
+0

什麼是「什麼」?爲什麼「if(i> = myList.Length)」在裏面? –

+0

很抱歉固定在那裏。 –

0

可以在兩個步驟做:

var groups = myList.Select((x,i) => new {X=x, I=i/5}) 
        .GroupBy(xi => xi.I, xi => xi.X); 

  • 打造一雙價值和指數
  • 集團通過index/5

的片段值

示例程序RAM:

using System.Linq; 

namespace BatchLinq 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      var myList = Enumerable.Range(0, 23); 
      var groups = myList.Select((x,i) => new {X=x, I=i/5}) 
         .GroupBy(xi => xi.I, xi => xi.X); 

      foreach (var group in groups) 
       System.Console.Out.WriteLine("{{ {0} }}", string.Join(", ", group)); 
     } 
    } 
} 

的輸出是:

{ 0, 1, 2, 3, 4 } 
{ 5, 6, 7, 8, 9 } 
{ 10, 11, 12, 13, 14 } 
{ 15, 16, 17, 18, 19 } 
{ 20, 21, 22 } 
+0

請注意,通過這樣做,只要您評估第一次迭代,它就會遍歷整個源序列。 –

0

編輯:

static IEnumerable<IEnumerable<T>> PrepareCollection<T>(List<T> input) 
{ 
    int cnt = 0; 

    while (cnt < input.Count) 
    { 
     IEnumerable<T> arr = input.Skip(cnt).Take(5); 
     cnt += 5; 
     yield return arr; 
    } 
} 
+0

錯誤的實現 - 它會多次評估輸入。 –

+0

你可以替代(...),並擺脫乘法,不是嗎? –

+0

@JonSkeet - 對,謝謝,編輯。 –