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程序更加简洁高效。
现在看来不同编程语言还是有它独特的语言特性,不止要写能运行的代码,还要学更好的代码和程序设计思维才行。