C#中yield return用法
2016-03-19 14:33
253 查看
1.yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历不使用yield return的实现
[/code]使用yeild return实现
[/code]客户端调用的代码是相同的
[/code]使用这个代码测试LINQ表达式,结果发现:方法的类不是IEnumerable<T>类型,只有方法的返回值是IEnumerable<T>,所以只能对方法的返回值使用LINQ所以使用LINQ就有两个条件:1.对类来说,这个类继承了IEnumerable<T>,就要实现IEnumerator GetNumerator方法2.对方法来说,这个方法返回了IEnumerable<T>接口的类型虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。
第一种方法,客户端调用过程大致为:
使用yield return,客户端调用过程大致为:
使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
--因为,编译器会生成一个状态机来维护迭代器的状态。
简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。
来源: <http://www.jb51.net/article/54810.htm>
实现一个IEnumerable接口的代码
[/code]
来自为知笔记(Wiz)
static IEnumerable<int> FilterWithoutYield()
{
List<int> result = new List<int>();
foreach (int i in GetInitialData())
{
if (i > 2)
{
result.Add(i); //这里的add就把结果都给了result,返回一个List<int>类型的result对象,所以这里返回的结果result是List<int>类型,会转化为IEnumerable<int>类型
}
}
return result;
}
[/code]使用yeild return实现
static IEnumerable<int> FilterWithYield()
{
foreach (int i in GetInitialData())
{
if (i > 2)
{
yield return i;
}
}
yield break;
Console.WriteLine("这里的代码不执行");
}
[/code]客户端调用的代码是相同的
static void Main(string[] args)
{
foreach (var item in FilterWithYield())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
[/code]使用这个代码测试LINQ表达式,结果发现:方法的类不是IEnumerable<T>类型,只有方法的返回值是IEnumerable<T>,所以只能对方法的返回值使用LINQ所以使用LINQ就有两个条件:1.对类来说,这个类继承了IEnumerable<T>,就要实现IEnumerator GetNumerator方法2.对方法来说,这个方法返回了IEnumerable<T>接口的类型虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。
第一种方法,客户端调用过程大致为:
使用yield return,客户端调用过程大致为:
使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
--因为,编译器会生成一个状态机来维护迭代器的状态。
简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。
来源: <http://www.jb51.net/article/54810.htm>
实现一个IEnumerable接口的代码
public class Stack : IEnumerable
{
int[] items ={ 1, 2, 3, 4, 5, 6, 7, 8, 9};
public IEnumerator GetEnumerator()
{
for (int i = 0; i < items.Length; i++)
{
yield return items[i]; // return返回的是IEnumerator集合对象,也就是说类中本身就有了一个
//IEnumerator对象,Foreach遍历的时候,也遍历的是这个IEnumerator对象,所以直接写foreach(var i in ss)就可以了,底层帮助完成其他代码
}
}
}
[/code]
来自为知笔记(Wiz)
相关文章推荐
- C#之文件管理
- C#在Winform中使用GMap.Net地图开发控件在离线模式下绘制两点路线
- C#中的try catch finally
- C#中的string驻留池
- C#中的Attribute Property区别
- C#中的全局程序集缓存定义
- C#中的正则表达式
- C#中的文本乱码问题
- C#中的Socket
- C#中的DES加密
- C#中的==和Equals
- C#中的Dynamic
- C#中的集合
- C#中的LINQ 基础
- C#中的数组
- C#中的public protected internal private
- C#中的Attribute定义及用法
- c#中的泛型
- C# 在第二个窗体上添加数据之后如何刷新第一个窗体加载的数据
- 假定已经获取题库中的试题号抽取n题组成考题字符串