這個問題段是從here拆分數組或列表到使用LINQ
略有不同我有數字的陣列,其中欲產生的段的列表。段的結尾包含爲下一段的起始元素。我希望每個細分都有3個(本例中)。這裏有一個例證:
var origArray = new[] {1,2,3,4,5,6};
我想要得到的結果是:
{ {1,2,3}, {3,4,5}, {5,6} }
傳統的for循環可以做到這一點,但只是想知道如果有人這樣做的LINQ Ÿ方式。
這個問題段是從here拆分數組或列表到使用LINQ
略有不同我有數字的陣列,其中欲產生的段的列表。段的結尾包含爲下一段的起始元素。我希望每個細分都有3個(本例中)。這裏有一個例證:
var origArray = new[] {1,2,3,4,5,6};
我想要得到的結果是:
{ {1,2,3}, {3,4,5}, {5,6} }
傳統的for循環可以做到這一點,但只是想知道如果有人這樣做的LINQ Ÿ方式。
嘗試添加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();
}
兩種方法可以做到這一點使用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
我不是downvoter,但你可以很容易地修改代碼,你才能做你想做的事情聯繫到質疑的接受的答案。 – CoderDennis