這篇文章主要介紹了C#中yield return用法,對比使用yield return與不使用yield return的流程,更直觀的分析了yield
return的用法,需要的朋友可以參考下.
本文例項講述了C#中yield return用法,並且對比了使用yield return與不使用yield return的情況,以便讀者更好的進行理解。具體如下:
yield關鍵字用於遍歷迴圈中,yield return用於返回IEnumerable<T>,yield break用於終止迴圈遍歷。
有這樣的一個int型別的集合:
static
List<
int
> GetInitialData()
{
return
new
List<
int
>(){1,2,3,4};
}
需要列印出所有值大於2的元素。
不使用yield return的實現
static
IEnumerable<
int
> FilterWithoutYield()
{
List<
int
> result =
new
List<
int
>();
foreach
(
int
i
in
GetInitialData())
{
if
(i > 2)
{
result.Add(i);
}
}
return
result;
}
客戶端呼叫:
static
void
Main(
string
[] args)
{
foreach
(var item
in
FilterWithoutYield())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
輸出結果:3,4
使用yeild return實現
static
IEnumerable<
int
> FilterWithYield()
{
foreach
(
int
i
in
GetInitialData())
{
if
(i > 2)
{
yield
return
i;
}
}
yield
break
;
Console.WriteLine(
"這裡的程式碼不執行"
);
}
客戶端呼叫:
static
void
Main(
string
[] args)
{
foreach
(var item
in
FilterWithYield())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
輸出結果:3,4
總結:
通過單步除錯發現:
雖然2種方法的輸出結果是一樣的,但運作過程迥然不同。第一種方法,是把結果集全部載入到記憶體中再遍歷;第二種方法,客戶端每呼叫一次,yield return就返回一個值給客戶端,是"按需供給"。
第一種方法,客戶端呼叫過程大致為:
使用yield return,客戶端呼叫過程大致為:
使用yield return為什麼能保證每次迴圈遍歷的時候從前一次停止的地方開始執行呢?
--因為,編譯器會生成一個狀態機來維護迭代器的狀態。
簡單地說,當希望獲取一個IEnumerable<T>型別的集合,而不想把資料一次性載入到記憶體,就可以考慮使用yield return實現"按需供給"。