C#使用yield实现高效查询
来源:互联网 发布:面壁思过网络意思 编辑:程序博客网 时间:2024/05/22 10:25
Yield是在学习Lua的协程时了解的概念,在C#中也有这样的关键词(效果和用法也很类似),官方介绍说是表示所在的函数是个“迭代阻塞”,一般需要结合return语句返回给迭代器一个具体值,还可以结合break语句灵活地表示迭代的结束。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { List<string> li = new List<string>(); li.Add("apple"); li.Add("pear"); li.Add("banana"); li.Add("apple"); string obj = "apple"; #region yield方式查询数据 Console.WriteLine("Good example!"); IEnumerator<string> enumerator = FindObj(li, obj); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); } //或者 foreach (string r in FindObj2(li, obj)) { Console.WriteLine(r); } #endregion #region 使用List保存结果 Console.WriteLine("Bad example!"); List<string> res= FindObjUsingList(li,obj); foreach (string r in res) { Console.WriteLine(r); } #endregion } //使用yield,代码更高效且更有可读性,返回IEnumerator类型表示可以循环获取 // 每次返回单个数据 static IEnumerator<string> FindObj(List<string> strs, string objStr) { foreach (var str in strs) { if (str == objStr) { //挂起并返回结果数据 yield return str; } } } static System.Collections.IEnumerable FindObj2(List<string> strs, string objStr) { foreach (var str in strs) { if (str == objStr) { //挂起并返回结果数据 yield return str; } } } //传统的查找方法,保存到List中,费空间不易扩展 static List<string> FindObjUsingList(List<string> strs, string objStr) { List<string> res = new List<string>(); foreach (var str in strs) { if (str == objStr) { res.Add(str); } } return res; } }}
运行结果
Good example!appleappleappleappleBad example!appleapple
也是偶然发现C#有yield这个关键词的,以前一直用传统的方式进行查找(沿用C语言的编程思维),需要用一个数组存储查询结果,现在用yield程序更加简洁高效。
现在看来不同编程语言还是有它独特的语言特性,不止要写能运行的代码,还要学更好的代码和程序设计思维才行。
- C#使用yield实现高效查询
- C# 使用yield实现循环
- C# yield 关键字 使用
- C# 中yield使用
- C# 中的"yield"使用
- 使用yield return实现foreach
- c# 高效的分页查询
- 用C#中的yield实现Coroutine框架
- php和C#的yield实现对比
- C#使用yield关键字让自定义集合实现foreach遍历的方法
- 了解 C# foreach 内部语句和使用 yield 实现的自定义迭代器
- Unity3D里C#脚本使用yield
- Unity3D里C#脚本使用yield
- Unity3D里C#脚本使用yield
- C# yield
- C# - yield
- c# yield
- C# Yield
- Sqlite DatebaseBrowser不能打开wal的数据库
- vmware 删除后安装不了,vmware workstation.msi failed
- C++优秀经典教程推荐
- spring定时任务之quartz
- 供自己参考link2005错误
- C#使用yield实现高效查询
- 为火狐增加撤销关闭按钮扩展--Undo Closed Tabs Button
- 勉励一下
- 在Java中正确解码用Javascript:escape()编码的中文字符
- 测试linux下一些最基本的服务情况的方法
- Spring 2.5中JdbcTemplate类query方法的三种回调接口
- sql查询分页
- WebView的Demo
- jquery 事件冒泡的介绍