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;
}
}
我必须创建一个扩展方法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;
}
}