在下面的代码中,我创建了一个使用Yield打印值的方法,另一个只是一个简单的列表迭代。所以这里我的问题是从这两种方法获得的输出是相同的,那么为什么我们选择Yield关键字呢?还请告诉我应用程序中Yield关键字的确切用法。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace YieldKeyWordEg
{
class Program
{
static void Main(string[] args)
{
Animals obj = new Animals();
Console.WriteLine("------ Using Yield ------");
foreach (var item in obj.GetName())
{
Console.WriteLine(item);
}
Console.WriteLine("------ Using List Iteration ------");
foreach (var items in obj.GetNameinList())
{
Console.WriteLine(items);
}
Console.ReadLine();
}
}
class Animals
{
public IEnumerable<string> GetName()
{
List<string> objList = new List<string>();
objList.Add("Cow");
objList.Add("Goat");
objList.Add("Deer");
objList.Add("Lion");
foreach (var item in objList)
{
yield return item;
}
}
public List<string> GetNameinList()
{
List<string> objList = new List<string>();
objList.Add("Cow");
objList.Add("Goat");
objList.Add("Deer");
objList.Add("Lion");
return objList;
}
}
}
输出:
------ Using Yield ------
Cow
Goat
Deer
Lion
------ Using List Iteration ------
Cow
Goat
Deer
Lion
答案 0 :(得分:4)
直接来自MSDN
使用yield return语句一次返回一个元素。当在迭代器方法中达到yield return语句时,将返回表达式,并保留代码中的当前位置。下次调用迭代器函数时,将从该位置重新开始执行。
修改强> 要获取详细信息,请参阅this系列文章。
答案 1 :(得分:2)
使用yield return
来包装已经是IEnumerable的东西是浪费。
yield return
可用于将不 IEnumerable包装成IEnumerable。
如:
public IEnumerable<string> GetNames()
{
yield return "Cow";
yield return "Goat";
yield return "Lion";
yield return "Deer";
}
或者实际上有意义的事情,例如a tree traversal。
答案 2 :(得分:0)
示例:
public IEnumerable<MyClass> GetList()
{
foreach (var item in SomeList)
{
yield return new MyClass();
}
}
答案 3 :(得分:0)
第二个示例中的列表不执行任何操作 - 您不会返回它,并且当它在方法结束时超出范围时将被垃圾收集。在此示例中yield
的惯用法是:
public IEnumerable<string> GetName()
{
yield "Cow";
yield "Goat";
yield "Deer";
yield "Lion";
}