C#使用yield实现高效查询

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!
apple
apple
apple
apple
Bad example!
apple
apple

也是偶然发现C#有yield这个关键词的,以前一直用传统的方式进行查找(沿用C语言的编程思维),需要用一个数组存储查询结果,现在用yield程序更加简洁高效。

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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值