gpt4 book ai didi

c# - 关于yield return statement的问题

转载 作者:行者123 更新时间:2023-11-30 14:44:23 24 4
gpt4 key购买 nike

举个例子:

 public static IEnumerable<BigInt> EvenNumbers(IEnumerable<BigInt> numbers)  
{
foreach (BigInt number in numbers)
{
if (number % 2 == 0)
{
yield return number;
}
}
}

这将只返回符合条件的值 (n % 2 == 0)。但是 yield return number 和 yield return number 之间有什么区别?并返回编号;?

如果我说 yield return number,它会把每个数字返回给调用函数等等吗?我在哪里可以找到有关幕后发生的事情的一些详细信息?

谢谢

最佳答案

“return”在这里根本不起作用(因为它会尝试返回一个 BigInt ,并且该方法声明一个 IEnumerable<BigInt> 。Jon Skeet 在C# in Depth免费 第 6 章(然后购买整本书 - 真的很值得 ;-p)。


编辑 - 这里有一个非常粗略的版本,说明您要自己编写此代码必须做的事情;请注意,它并不完全相同,但实现了目标。我想你会同意 yield return版本更简单!

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
static class Program
{
static void Main()
{
IEnumerable<int> source = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach (int value in EvenNumbers(source))
{
Console.WriteLine(value);
}
}

public static IEnumerable<int> EvenNumbers(IEnumerable<int> numbers)
{
return new EvenEnumerable(numbers);
}
class EvenEnumerable : IEnumerable<int>
{
private readonly IEnumerable<int> numbers;
public EvenEnumerable(IEnumerable<int> numbers) {
this.numbers = numbers;
}
public IEnumerator<int> GetEnumerator()
{
return new EvenEnumerator(numbers);
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
class EvenEnumerator : IEnumerator<int>
{
private readonly IEnumerable<int> numbers;
public EvenEnumerator(IEnumerable<int> numbers)
{
this.numbers = numbers;
}
private int current;
void IEnumerator.Reset() { throw new NotSupportedException(); }
public int Current { get { return current; } }
object IEnumerator.Current { get { return Current; } }
IEnumerator<int> iter;
public bool MoveNext()
{
if (iter == null) iter = numbers.GetEnumerator();
while (iter.MoveNext())
{
int tmp = iter.Current;
if (tmp % 2 == 0)
{
current = tmp;
return true;
}
}
return false;
}
public void Dispose()
{
if (iter != null)
{
iter.Dispose();
iter = null;
}
}
}
}

关于c# - 关于yield return statement的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/559240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com