来自给定有限列表的linq无限列表

Cri*_*scu 9 .net c# linq lazy-evaluation infinite-sequence

给定一个有限的元素列表,我如何创建一个(懒惰评估,谢谢LINQ!)无限列表,只是不断迭代我的初始列表?

如果是初始列表{1, 2, 3},我想要返回新列表{1, 2, 3, 1, 2, 3, 1, ...}

Rya*_*ner 17

yield return 虽然它并不真正需要LINQ,但它是一个非常方便的运算符.

IEnumerable<int> GetInfiniteSeries(IEnumerable<int> items) {
    while (true) {
       foreach (var item in items) { 
           yield return item;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*ran 6

IEnumerable<T> Infinite(this IEnumerable<T> ienum)
{
    List<T> list = ienum.ToList();
    while (true)
       foreach(var t in list)
           yield return t;
}



foreach(int i in Enumerable.Range(1,3).Infinite())
      Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

  • @Ani:你怎么知道存在性能问题?你知道没有经验证据表明创建和销毁列表迭代器 - 一个由BCL团队专门设计的结构,分配和处理速度极快 - 是用户应用程序中最慢的东西吗?或者您是否进行了大量仔细的分析工作,以确定此结构的分配和处理实际上是用户应用程序中最大的性能问题?如果是这样,那么我希望看到这些数据,以便我可以将其传递给BCL表演团队,谢谢! (2认同)
  • @Eric Lippert:我们在这里写一个实用工具方法,所以我们不知道用户的应用程序!因此,我认为我们应该让用户尽可能地使方法尽可能高,因为CLR团队使列表迭代器尽可能快 - 他们不知道什么会变慢用户的应用程序,是吗?当然,我没有任何"经验证据表明创建和销毁列表迭代器很慢",所以我的推荐可能是错的. (2认同)