Looping through dictionary object
我对.NET非常陌生,以前在PHP中工作。我需要通过foreach迭代一个对象字典。我的设置是MVC4应用程序。
模型如下:
1 2 3 4 5 6 7 8
| public class TestModels
{
Dictionary <int, dynamic> sp = new Dictionary <int, dynamic>
{
{1, new {name ="abc", age ="1"}},
{2, new {name ="def", age ="2"}}
}
} |
控制器:
1 2 3 4
| public class TestController : Controller
{
Models .TestModels obj = new Models .TestModels();
} |
如何循环访问obj对象并检索字典的值并在视图中打印它们?
- 在C中迭代字典的最佳方法可能是什么?
- (我也投了同样的票:请记住,迭代顺序没有定义。)
一种方法是循环使用字典的键,我建议这样做:
1 2
| foreach(int key in sp.Keys)
dynamic value = sp[key]; |
另一种方法是将字典作为成对序列循环:
1 2 3 4 5
| foreach(KeyValuePair<int, dynamic> pair in sp)
{
int key = pair.Key;
dynamic value = pair.Value;
} |
我建议使用第一种方法,因为如果使用适当的LINQ语句来修饰Keys属性,可以更好地控制检索项的顺序,例如,sp.Keys.OrderBy(x => x)帮助您按键的升序检索项。注意,Dictionary在内部使用哈希表数据结构,因此,如果使用第二种方法,则项目的顺序不容易预测。
更新(2016年12月1日):将var替换为实际类型,以使答案更清楚。
- 那么在视图中应该做什么呢?值也将包含这两个值,对吗?那么我只需要做value.0和value.1就可以打印了?
- 不,你可以按照我的回答来做,或者根据新浪的回答,你可以用value和你给变量的名字来命名,比如value.name或value.age。
- 小贴士:如果不使用var关键字,这会让你更容易理解。
这要看你在字典里找什么
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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 2 3 4 5 6 7
| 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);
} |
您现在最可能遇到的问题是集合是私有的。如果将public添加到此行的开头
1
| Dictionary <int, dynamic> sp = new Dictionary <int, dynamic> |
您应该能够从控制器内部的函数访问它。
编辑:添加完整TestModels实现的功能示例。
你的TestModels类应该是这样的。
1 2 3 4 5 6 7 8 9 10
| 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});
}
} |
您可能还想阅读动态关键字。
1 2 3 4 5 6 7 8 9 10
| 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});
}
} |
- 你的回答当然值得一点解释。请参阅stackoverflow.com/help/how-to-answer。