2011-05-06 115 views
1

我有以下類創建:遍歷集合中的C#

[Serializable] 
public class AppContext : IXmlSerializable { 
    public string reportType = string.Empty; 
    public string entityId = string.Empty; 

    // OPTIONS 
    public IDictionary<string, OPTIONS> dict_Options = new Dictionary<string, OPTIONS>(); 
    // Advanced Options 
    public List<string> listAdvancedOptions = new List<string>(); 



    public class OPTIONS { 
     public string subjectId = string.Empty; 
     public string varNumber = string.Empty; 
    } 
} 

如何遍歷選擇,讓所有的varNumbers?

+0

遍歷'listAdvancedOptions'或'dict_Options'? – Tejs 2011-05-06 19:33:39

+0

@chris你必須點擊答案旁邊的複選標記才能接受它,你目前已經不接受 - http://stackoverflow.com/faq#howtoask – 2011-05-06 19:41:30

+0

什麼checkmard?我只看到向上或向下的箭頭。 – chris 2011-05-06 19:43:59

回答

5

方法1

foreach (KeyValuePair<string, AppContext.OPTIONS> kvp in appContext.dict_Options) 
{ 
    Console.WriteLine(kvp.Value.varNumber); 
} 

方法2

foreach (AppContext.OPTIONS item in appContext.dict_Options.Values) 
{ 
    Console.WriteLine(item.varNumber); 
} 

方法3

foreach (string item in appContext.dict_Options.Select(x => x.Value.varNumber)) 
{ 
    Console.WriteLine(item); 
} 
1

OPTIONS是一個沒有實現任何集合接口的類(比如IEnumerable)。你不能迭代它。

可以遍歷你的字典 - dict_Options

foreach(var item in dict_Options) 
{ 
    // use item - say item.varNumber 
} 

注:

在你的類的公共領域是糟糕的設計 - 它違反了封裝和信息隱藏,將使其難以進化類。你應該使用私人領域和公共財產來暴露他們。

2

一個Dictionary<TKey, TVal>實現IEnumerable<KeyValuePair<TKey, TVal>>,那麼試試這個:在所有的

var varNumbers = dictOptions.Values.Select(v=>v.varNumber); 
+0

什麼庫是選擇?它表示沒有選擇的定義。 – chris 2011-05-06 19:51:26

+0

Select()是Linq的一部分,通過引用和使用System.Linq來訪問。它只能在3.5及更高版本中使用,所以如果您仍然使用2.0,我會考慮升級。 – KeithS 2011-05-06 20:03:26

0

如果你只是想循環:

var varNumbers = dict_Options.Select(kvp=>kvp.Value.varNumber); 

您也可以直接訪問該字典的值的IEnumerable VARNumbers我可能會做以下幾點:

 var dict_Options = new Dictionary<string, OPTIONS>(); 

     foreach (var varNumber in dict_Options.Select(kvp => kvp.Value.varNumber)) 
     { 
      // Your code. 
     }