c# - 关于yield return statement的问题

标签 c# .net

举个例子:

 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/

相关文章:

C# 2D Array - 如何打印每行中最大的元素

c# - 使用成员表进行代码优先建模

.net - .NET 4.0 代码可以与 .NET 2.0 代码互操作吗?

c# - 访问共享文件?

.net - CSS 中的 Base64 编码图像

c# - 带有 ASP.NET MVC 3 的 CSVHelper

c# - 是否可以为每个实体使用单独的 ssdl、csdl 和 msl 文件?

javascript - ASP.NET 上的 Jquery 掩码不起作用

c# - 我如何启动这样的自定义变量; "Serie S = new Serie() { 1, 2, 3, 4 }"?

c# - 是否有可以与 ASP.NET 一起使用的堆叠饼图?