C# 循环列表中的 ToSkip 元素

ToSkip elements on C# circular list

我必须创建一个扩展方法jump<T>,它采用任意序列 s,returns 是一个无限序列,其元素是通过循环访问 s 并跳过 n 个元素获得的。所以,如果step == 0,那么所有序列都是returned(无限次),如果step == 1,我们以区间[0-10]中的所有数字为例,将return 0,2,4,6,8,10,1,3,5 ECC。如果 step==2 那么结果将是 0,3,6,9,1,4,7,10。 显然这只是一个有序的 int 列表的例子,我需要用一个通用的 T 元素序列来做到这一点。

我怎样才能做到这一点?

为了测试它,我创建了一个 nunit 测试如下:

  [Test]
        public void Jumping_validArg_IsOk()
    {

        var start = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
            .Jumping(3)
            .ToList()//remove this to make it work
            .Take(4);
        var expected = new[] {1, 5, 9, 2};
       CollectionAssert.AreEquivalent(start, expected);
    }

但它似乎永远不会结束并抛出 System.OutOfMemoryException.

解决方法: 我修改了一些我选择的最佳答案,以这种方式使其更通用:

        public static IEnumerable<T> Jump<T>(this IEnumerable<T> sequence, int step)
        {
            var pos = 0;
            var list = sequence.ToList();
            while (true)
            {
                yield return list[pos];
                pos = (pos + step + 1) % list.Count;
            }
        }

以这种方式,它应该适用于所有 IEnumerable。我在测试中添加了一条评论,以显示要删除哪些内容才能使其正常工作。希望一切正确。

您可以使用 yield return 语句轻松实现:

public static IEnumerable<T> Jump<T>(this IList<T> data, int step) {
    int pos = 0;
    while(true) {
        yield return data[pos];
        pos = (pos + step) % data.Count;
    }
}