2016-07-24 45 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