2012-05-02 66 views
2

我有以下的功能,但它是非常長的,骯髒的,我想優化它:的foreach得到下一個項目

 //some code 
     if (use_option1 == true) 
     { 
      foreach (ListViewItem item in listView1) 
      { 
       //1. get subitems into a List<string> 
       // 
       //2. process the result using many lines of code 
      } 
     } 
     else if (use_option2 = true) 
     { 
      //1. get a string from another List<string> 
      // 
      //2. process the result using many lines of code 
     } 
     else 
     { 
      //1. get a string from another List<string> (2) 
      // 
      //2. process the result using many lines of code 
     } 

這是工作非常好,但它是非常骯髒 我想用這樣的:

 //some code 
     if (use_option1 == true) 
     { 
      List<string> result = get_item();//get subitems into a List<string> 
     } 
     else if (use_option2 = true) 
     { 
      //get a string from another List<string> 
     } 
     else 
     { 
      //get a string from another List<string> (2) 
     } 


      //process the result using many lines of code 


     private void get_item() 
     { 
      //foreach bla bla 
     } 

我該如何讓get_item函數每次獲取列表中的下一個項目?

我讀了一些關於GetEnumerator的內容,但我不知道如果這是解決我的問題或如何使用它。

+1

每個選項的處理代碼是否相似? – Justin

+1

在第一個代碼段中,這個「// 2。使用多行代碼處理結果」的評論,這是同一個過程嗎? –

+0

是的,它是一樣的,但我不能在一個函數內部使用它,因爲從開始的代碼(/ /某些代碼)。所以唯一的選擇是從void使用foreach – ShaMora

回答

0

您可以在官方文檔閱讀本 - 舉例:MSDN reference

+1

這只是一個鏈接,還是你的意思是「LINQ」? – sinelaw

+0

我已經讀過關於IEnumerable.GetEnumerator方法,但我是一個C#初學者,所以我不知道如何實現它 – ShaMora

+0

沒有人知道? – ShaMora

1

看一看的yield keyword它是有效的,並返回一個IEnumerable。請看下面的例子:

 List<string> list = new List<string> { "A112", "A222", "B3243" }; 

     foreach(string s in GetItems(list)) 
     { 
      Debug.WriteLine(s); 
     } 

如果你有一個GetItems方法定義如下:

public System.Collections.IEnumerable GetItems(List<string> lst) 
{ 
    foreach (string s in lst) 
    { 
     //Some condition here to filter the list 
     if (s.StartsWith("A")) 
     { 
      yield return s; 
     } 
    } 
} 

你的情況,你會是這樣的:

public System.Collections.IEnumerable GetItems() 
{ 
    for (ListViewItem in ListView) 
    { 
     //Get string from ListViewItem and specify a filtering condition 
     string str = //Get string from ListViewItem 
     //Filter condition . e.g. if(str = x) 
     yield return str; 
    } 
} 

如果你想要去進一步使用LINQ,那麼它會下降到一行:

public System.Collections.IEnumerable GetItems(List<string> lst) 
{ 
    return lst.Where(T => T.StartsWith("A")); 
} 

希望這是有用的。