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