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程序更加简洁高效。

现在看来不同编程语言还是有它独特的语言特性,不止要写能运行的代码,还要学更好的代码和程序设计思维才行。



原创粉丝点击