C# 访问收益率返回集合

C# 访问收益率返回集合,c#,generator,C#,Generator,在构建IEnumerable本身的方法中,是否有任何方法可以访问由yield return在循环中构建的IEnumerable集合 愚蠢的例子: Random random = new Random(); IEnumerable<int> UniqueRandomIntegers(int n, int max) { while ([RETURN_VALUE].Count() < n) { int value = random.Next(max)

在构建
IEnumerable
本身的方法中,是否有任何方法可以访问由
yield return
在循环中构建的
IEnumerable
集合

愚蠢的例子:

Random random = new Random();

IEnumerable<int> UniqueRandomIntegers(int n, int max)
{
    while ([RETURN_VALUE].Count() < n)
    {
        int value = random.Next(max);
        if (![RETURN_VALUE].Contains(value))
            yield return value;
    }
}
Random Random=new Random();
IEnumerable uniquerandomineger(int n,int max)
{
while([返回值].Count()
没有正在建立的集合。返回的序列将被延迟计算,除非调用方显式地将数据复制到另一个集合,否则它将在获取数据后立即消失

如果你想确保独特性,你需要自己去做。例如:

IEnumerable<int> UniqueRandomIntegers(int n, int max)
{
    HashSet<int> returned = new HashSet<int>();
    for (int i = 0; i < n; i++)
    {
        int candidate;
        do
        {
            candidate = random.Next(max);
        } while (returned.Contains(candidate));
        yield return candidate;
        returned.Add(candidate);
    }
}
如果集合中已存在项,则
Add
将返回
false

未建立集合。返回的序列将被延迟计算,除非调用方显式地将数据复制到另一个集合,否则它将在获取数据后立即消失

如果你想确保独特性,你需要自己去做。例如:

IEnumerable<int> UniqueRandomIntegers(int n, int max)
{
    HashSet<int> returned = new HashSet<int>();
    for (int i = 0; i < n; i++)
    {
        int candidate;
        do
        {
            candidate = random.Next(max);
        } while (returned.Contains(candidate));
        yield return candidate;
        returned.Add(candidate);
    }
}

如果集合中已经存在该项,
Add
将返回
false

访问是什么意思?你可以预测结果,不是吗?对不起,我没有说清楚-我的意思是从构建
IEnumerable
本身的方法中。问题经过澄清更新。您已经为自己创建了一个方法,它返回一个
IEnumerable
集合。你究竟为什么不能在循环中使用它?@Patrick问题很清楚,请检查代码中的
[返回值]
。OP:你为什么不直接使用
列表
Add()
而不是
yield
?@CodeCaster:是的。这个问题被修改了,我以前不太清楚。你说的访问是什么意思?你可以预测结果,不是吗?对不起,我没有说清楚-我的意思是从构建
IEnumerable
本身的方法中。问题经过澄清更新。您已经为自己创建了一个方法,它返回一个
IEnumerable
集合。你究竟为什么不能在循环中使用它?@Patrick问题很清楚,请检查代码中的
[返回值]
。OP:你为什么不直接使用
列表
Add()
而不是
yield
?@CodeCaster:是的。虽然这个问题被修改了,但我以前并不清楚。通过使用
Add
的返回值,可以稍微简化代码,例如
do{}while(!returned.Add(candidate))
。这样就不需要调用
Contains
。或者在将项目添加到集合之前,您是否有理由等待下一次迭代?内存空间优化?@dcastro:不特别。我确实认为让这种情况没有副作用更清楚,但我接受你的观点。已编辑答案以提供这两个选项。可以使用
Add
的返回值稍微简化代码,例如
do{}而(!returned.Add(candidate))
。这样就不需要调用
Contains
。或者在将项目添加到集合之前,您是否有理由等待下一次迭代?内存空间优化?@dcastro:不特别。我确实认为让这种情况没有副作用更清楚,但我接受你的观点。已编辑答案以提供两个选项。