2016-07-24 54 views
0

這個問題段是從here拆分數組或列表到使用LINQ

略有不同我有數字的陣列,其中欲產生的段的列表。段的結尾包含爲下一段的起始元素。我希望每個細分都有3個(本例中)。這裏有一個例證:

var origArray = new[] {1,2,3,4,5,6}; 

我想要得到的結果是:

{ {1,2,3}, {3,4,5}, {5,6} } 

傳統的for循環可以做到這一點,但只是想知道如果有人這樣做的LINQ Ÿ方式。

+0

我不是downvoter,但你可以很容易地修改代碼,你才能做你想做的事情聯繫到質疑的接受的答案。 – CoderDennis

回答

2

嘗試添加Microsoft的Reactive Framework團隊的交互式擴展 - 只是NuGet「Ix-Main」。

然後,你可以這樣做:

var origArray = new[] {1,2,3,4,5,6}; 
var result = origArray.Buffer(3, 2); 

的兩個參數是「要多少給組」,3和「多少跳過」,2

結果如您期望的那樣:{ {1,2,3}, {3,4,5}, {5,6} }

這是https://github.com/Reactive-Extensions/Rx.NET/blob/master/Ix.NET/Source/System.Interactive/Buffer.cs及其履行情況:

private static IEnumerable<IList<TSource>> Buffer_<TSource>(this IEnumerable<TSource> source, int count, int skip) 
    { 
     var buffers = new Queue<IList<TSource>>(); 

     var i = 0; 
     foreach (var item in source) 
     { 
      if (i%skip == 0) 
       buffers.Enqueue(new List<TSource>(count)); 

      foreach (var buffer in buffers) 
       buffer.Add(item); 

      if (buffers.Count > 0 && buffers.Peek() 
              .Count == count) 
       yield return buffers.Dequeue(); 

      i++; 
     } 

     while (buffers.Count > 0) 
      yield return buffers.Dequeue(); 
    } 
0

兩種方法可以做到這一點使用LINQ。

var segmentedArray1 = origArray 
    .Select((item, index) => new { item, index }) 
    .GroupBy(x => x.index/3) 
    .Select(@group => @group.Select(x=>x.item)); 

var segmentedArray2 = Enumerable.Range(0, origArray.Count()) 
    .GroupBy(x => x/3) 
    .Select(@group => @group.Select(index => origArray[index])); 

這裏有一個dotnetfiddle