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:不特别。我确实认为让这种情况没有副作用更清楚,但我接受你的观点。已编辑答案以提供两个选项。