C#中yield return用法分析
本文實(shí)例講述了C#中yield return用法,并且對(duì)比了使用yield return與不使用yield return的情況,以便讀者更好的進(jìn)行理解。具體如下:
yield關(guān)鍵字用于遍歷循環(huán)中,yield return用于返回IEnumerable<T>,yield break用于終止循環(huán)遍歷。
有這樣的一個(gè)int類型的集合:
static List<int> GetInitialData()
{
return new List<int>(){1,2,3,4};
}
需要打印出所有值大于2的元素。
不使用yield return的實(shí)現(xiàn)
static IEnumerable<int> FilterWithoutYield()
{
List<int> result = new List<int>();
foreach (int i in GetInitialData())
{
if (i > 2)
{
result.Add(i);
}
}
return result;
}
客戶端調(diào)用:
static void Main(string[] args)
{
foreach (var item in FilterWithoutYield())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
輸出結(jié)果:3,4
使用yeild return實(shí)現(xiàn)
static IEnumerable<int> FilterWithYield()
{
foreach (int i in GetInitialData())
{
if (i > 2)
{
yield return i;
}
}
yield break;
Console.WriteLine("這里的代碼不執(zhí)行");
}
客戶端調(diào)用:
static void Main(string[] args)
{
foreach (var item in FilterWithYield())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
輸出結(jié)果:3,4
總結(jié):
通過(guò)單步調(diào)試發(fā)現(xiàn):
雖然2種方法的輸出結(jié)果是一樣的,但運(yùn)作過(guò)程迥然不同。第一種方法,是把結(jié)果集全部加載到內(nèi)存中再遍歷;第二種方法,客戶端每調(diào)用一次,yield return就返回一個(gè)值給客戶端,是"按需供給"。
第一種方法,客戶端調(diào)用過(guò)程大致為:

使用yield return,客戶端調(diào)用過(guò)程大致為:

使用yield return為什么能保證每次循環(huán)遍歷的時(shí)候從前一次停止的地方開始執(zhí)行呢?
--因?yàn)?,編譯器會(huì)生成一個(gè)狀態(tài)機(jī)來(lái)維護(hù)迭代器的狀態(tài)。
簡(jiǎn)單地說(shuō),當(dāng)希望獲取一個(gè)IEnumerable<T>類型的集合,而不想把數(shù)據(jù)一次性加載到內(nèi)存,就可以考慮使用yield return實(shí)現(xiàn)"按需供給"。
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
WCF實(shí)現(xiàn)的計(jì)算器功能實(shí)例
這篇文章主要介紹了WCF實(shí)現(xiàn)的計(jì)算器功能,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了WCF實(shí)現(xiàn)計(jì)算器功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
c#使用filesystemwatcher監(jiān)視文件系統(tǒng)的變化
對(duì)于一個(gè)文件夾的改變,C#這邊有自己的類來(lái)實(shí)現(xiàn),我們不需要關(guān)心它的內(nèi)部實(shí)現(xiàn)機(jī)制,不需要關(guān)心它底層調(diào)用哪些API,我們只需要關(guān)心如何去調(diào)用它,如何讓它幫助我們記錄文件夾的修改情況即可,下面我們就實(shí)現(xiàn)它2014-01-01
C# 從Excel讀取數(shù)據(jù)向SQL server寫入
這篇文章主要介紹了C# 從Excel讀取數(shù)據(jù)向SQL server寫入的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03

