C# yield用法

跟着阿笨一起玩NET

共 2265字,需浏览 5分钟

 · 2022-07-07


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

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

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

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


例子:

yield return <expression>;

yield break;

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


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

普通写法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/// <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写法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/// <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写法很明显比普通写法代码更加简洁,性能也更高

普通写法是将满足条件的全部查询出来保存到一个临时变量中,最后全部返回出去

客户端调用

1

2

3

4

5

var list = numList.FilterNum();

foreach (int item in list2)

{

 

}

在执行numList.FilterNum()的时候并不会返回结果,也不会进入FilterNum()方法,只有在遍历(foreach)的时候,才会进入FilterNum()方法,而且每遍历一次进入一次

yield return 每次遇到符合条件的都会立即返回对应的值出去,遇到yield break会结束迭代器


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

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


浏览 4
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报