2014-02-20 73 views
2

在下面的代碼中,我創建了一個使用Yield打印值的方法,另一個方法是簡單的列表迭代。所以這裏我的問題是從兩個方法獲得的輸出都是一樣的,爲什麼我們要使用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 

回答

4

直接從MSDN

您使用yield return語句每個元素一次一個返回。當收益率重新在迭代器方法中達到轉向語句,返回表達式,並保留代碼中的當前位置。下一次調用迭代器函數時,將從該位置重新啓動執行。

編輯: 瞭解詳細內容見this系列文章。

+0

您能否顯示yield的任何實際用法或此類用法的任何鏈接? – szpic

+0

@szpic請參閱編輯。 – Ehsan

+0

謝謝。我也發現這個鏈接可以充分理解yield的實際用法:[Click](http://programmers.stackexchange.com/questions/97295/a-practical-use-of-yield-keyword-in-c) – szpic

0

例子:

public IEnumerable<MyClass> GetList() 
{ 
    foreach (var item in SomeList) 
    { 
      yield return new MyClass(); 
    } 
} 
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

0

第二個示例中的列表不執行任何操作 - 您不返回它,並且在方法結束時超出範圍時它將被垃圾收集。 yield在本例中的慣用用法是:

public IEnumerable<string> GetName() 
     { 
      yield "Cow"; 
      yield "Goat"; 
      yield "Deer"; 
      yield "Lion"; 
     }