遍历字典对象

36

我对.NET非常不熟悉,以前是用PHP工作的。我需要通过foreach迭代一个对象字典。我的设置是一个MVC4应用程序。

模型看起来像这样:

public class TestModels
{
    Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>
    {
        {1, new {name="abc", age="1"}},
        {2, new {name="def", age="2"}}
    }
}

控制器:

public class TestController : Controller
{
   Models.TestModels obj = new Models.TestModels();
}

我该如何遍历obj对象并取出字典的值,然后在视图中打印出来?


2
可能是在C#中迭代字典的最佳方法是什么?的重复问题。 - Jeremy
2
我也投票为重复问题:请记住迭代顺序未定义.. - user166390
4个回答

55

一种方法是循环遍历字典的键,我建议这样做:

foreach(int key in sp.Keys)
    dynamic value = sp[key];

另一种方式是将字典作为一系列键值对进行循环遍历:
foreach(KeyValuePair<int, dynamic> pair in sp)
{
    int key = pair.Key;
    dynamic value = pair.Value;
}

我建议采用第一种方法,因为如果您在Keys属性上使用适当的LINQ语句进行装饰,例如sp.Keys.OrderBy(x => x),您可以更好地控制检索到的项目的顺序。请注意,Dictionary在内部使用哈希表数据结构,因此如果使用第二种方法,则项目的顺序不易预测。 更新(2016年12月1日):将var替换为实际类型,使答案更加清晰。

那么在视图中需要做些什么呢?同时,value将包含两个值,是吗?那么我只需要执行value.0和value.1来打印它们吗? - user1833222
不会。你可以像我的回答一样做,或者根据Sina的回答,使用“value”和您给变量命名的名称进行调用,例如“value.name”或“value.age”。 - eandersson
2
小小的建议:如果不使用var关键字,这将使得理解这个程序变得更加容易。 - Jezzamon

4

这取决于你在字典中需要什么。

Models.TestModels obj = new Models.TestModels();

foreach (var keyValuPair in obj.sp)
{
    // KeyValuePair<int, dynamic>
}

foreach (var key in obj.sp.Keys)
{
     // Int 
}

foreach (var value in obj.sp.Values)
{
    // dynamic
}

1
你可以这样做。
Models.TestModels obj = new Models.TestModels();
foreach (var item in obj.sp)
{
    Console.Write(item.Key);
    Console.Write(item.Value.name);
    Console.Write(item.Value.age);
}

您现在可能面临的问题是该集合为私有。如果您在此行开头添加公共,问题即可解决。
Dictionary<int, dynamic> sp = new Dictionary<int, dynamic> 

你应该能够从控制器内的函数访问它。
编辑:添加完整TestModels实现的功能示例。
你的TestModels类应该类似于这样。
public class TestModels
{
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>();

    public TestModels()
    {
        sp.Add(0, new {name="Test One", age=5});
        sp.Add(1, new {name="Test Two", age=7});
    }
}

您可能还想了解动态关键字。


0
public class TestModels
{
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>();

    public TestModels()
    {
        sp.Add(0, new {name="Test One", age=5});
        sp.Add(1, new {name="Test Two", age=7});
    }
}

2
你的回答确实值得一点解释。请参考http://stackoverflow.com/help/how-to-answer。 - J. Chomel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接