这个问题段是从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