在C#中迭代一个集合

时间:2011-05-06 19:32:33

标签: 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;
    }
}

如何迭代OPTIONS以获取所有varNumbers?

4 个答案:

答案 0 :(得分:6)

方法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 :(得分:2)

Dictionary<TKey, TVal>实施IEnumerable<KeyValuePair<TKey, TVal>>,请尝试以下操作:

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

您还可以直接访问字典值的IEnumerable:

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

答案 2 :(得分:1)

OPTIONS是一个没有实现任何集合接口的类(比如IEnumerable)。你不能迭代它。

您可以遍历字典 - dict_Options

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

注意:

在你的班级中设置公共字段是糟糕的设计 - 它违反了封装和信息隐藏,并且会使课程难以进化。您应该使用私有字段和公共属性来公开它们。

答案 3 :(得分:0)

如果您只想循环遍历所有varNumbers,我可能会执行以下操作:

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

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