使用LINQ将数组或列表拆分为多个段

本文关键字:拆分 列表 LINQ 数组 使用 | 更新日期: 2023-09-27 17:58:27

这个问题与这里的略有不同

我有一个数字数组,我想在其中生成一个分段列表。分段的末尾将作为下一个分段的起始元素。我希望每个片段(在本例中)各有3个点。这是一个例子:

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

我希望结果是:

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

传统的for循环可以实现这一点,但只是想知道是否有人以LINQy的方式实现了这一点。

使用LINQ将数组或列表拆分为多个段

尝试添加Microsoft的Reactive Framework团队的交互式扩展-仅NuGet"Ix Main";。

然后你可以这样做:

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

这两个参数是";分组多少";,1和"CCD_;跳过多少";,CCD_ 2。

结果正如您所期望的:{ {1,2,3}, {3,4,5}, {5,6} }

这是他们从https://github.com/dotnet/reactive/blob/main/Ix.NET/Source/System.Interactive/System/Linq/Operators/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