C# 从(无限)IEnumerable中获取n个不同项的简单LINQ方法

C# 从(无限)IEnumerable中获取n个不同项的简单LINQ方法,c#,.net,linq,generator,distinct,C#,.net,Linq,Generator,Distinct,我有一个类似infiniteIEnumerablesource的生成器,我想从中获取n个不同的项。有没有一种简单的LINQ风格的方法可以做到这一点(仍然很快) 如果没有简单的方法,我想出的算法是好主意吗 拿n个项目 呼叫独立 呼叫计数 如果计数

我有一个类似infinite
IEnumerable
source的生成器,我想从中获取n个不同的项。有没有一种简单的LINQ风格的方法可以做到这一点(仍然很快)

如果没有简单的方法,我想出的算法是好主意吗

  • 拿n个项目
  • 呼叫独立
  • 呼叫计数
  • 如果计数拿n个计数项目
  • 把那些拿出来,转到2号
  • 结束

  • 只需在
    Take
    之前调用
    Distinct
    即可获取n个不同的元素:

    var nDistincItems = source
        .Distinct()
        .Take(n);
    

    .Distinct()有什么问题吗?@juharr:嗯,没什么,我只是假设它不起作用。它比我提出的算法快吗?它是如何在内部工作的?它创建一个哈希集,然后迭代集合并尝试将该项放入哈希集中。如果它不在HashSet中,它将生成值。所以它消耗2*n内存,但我想这没关系。谢谢当遇到“无限可枚举”@clarkitect生成的几个非独立项时,仅当集合的独立项少于n个时,才会产生
    n
    的完整批大小。这是否适用于无限输入数据源?看不到OPs代码是不可能的,但我无法想象Distinct在默认情况下会与无限输入一起工作。@IanNewson:我也不相信它,但是,它看起来好像能工作…@IanNewson是的,它会的<例如,code>OrderBy
    可能是一个问题,但是
    Distinct
    不需要知道完整的集合才能工作