C# yield用法

yield 关键字向编译器指示它所在的方法是迭代器块

yield 关键字与 return 关键字结合使用,向枚举器对象提供值。

这是一个返回值,例如,在 foreach 语句的每一次循环中返回的值。

yield 关键字也可与 break 结合使用,表示迭代结束。.

例子:

yield return <expression>;

yield break;

在 yield return 语句中,将计算 expression 并将结果以值的形式返回给枚举器对象;expression 必须可以隐式转换为 yield 类型的迭代器。

这里看一个例子:(返回集合中大于5的值)

普通写法:

/// <summary>
/// 返回大于5的值
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static IEnumerable<int> FilterList(this IEnumerable<int> source)
{
    List<int> numList = new List<int>();
    foreach (int num in source)
    {
        if (num > 5)
        {
            numList.Add(num);
        }
    }
    return numList;
}

yield写法这种写法很普通,写起来也很容易理解

/// <summary>
/// 返回大于5的值
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static IEnumerable<int> FilterNum(this IEnumerable<int> source)
{
    foreach (int num in source)
    {
        if (num > 5)
        {
            yield return num;
        }
    }
    yield break;
}

普通写法是将满足条件的全部查询出来保存到一个临时变量中,最后全部返回出去yield写法很明显比普通写法代码更加简洁,性能也更高

客户端调用

var list = numList.FilterNum();
foreach (int item in list2)
{
}

yield return 每次遇到符合条件的都会立即返回对应的值出去,遇到yield break会结束迭代器在执行numList.FilterNum()的时候并不会返回结果,也不会进入FilterNum()方法,只有在遍历(foreach)的时候,才会进入FilterNum()方法,而且每遍历一次进入一次

yield 在.net framework中是非常普遍的

使用Linq分页技术我们通常都是使用Skip和Take关键字