我有一个C#dictionary
,其中有一个与NAME
相对应的ID
。
Dictionary<string, List<object>> dict = new Dictionary<string, List<object>>
{
{ "ID", new List<object> { "Id1", "Id2" } },
{ "NAME", new List<object> { "True", "False" } }
};
foreach (var id in dict["ID"])
{
Console.WriteLine(id);
//how to get corresponding "Name". For "Id1" = "True" and for "Id2" = "False"
}
在上面的代码中,我遍历了ID
,但是如何获得相应的NAME
?
答案 0 :(得分:7)
我认为更好的设计是使用两个属性创建一个类,然后进行迭代。如果您发现自己必须同步不同的数据结构以实现简单的数据表示,那么我建议您重新考虑设计。
public class MyClass
{
public string Id { get; set; }
public bool Name { get; set; }
}
然后按住List<MyClass>
进行迭代:
foreach (var item in list)
{
// Now access item.Id, item.Name
}
当您拥有某种数据的自然键并且想要通过该键访问对某项的访问时,使用字典是很好的选择。由于通过散列函数访问项目,因此在O(1)
中进行键访问,而在列表中进行O(n)
搜索。但是,在任何情况下,您都需要迭代所有项,因此不需要字典并将数据安排在一个类中是一个更好的设计。
关于差异和一些参考的一点:
答案 1 :(得分:1)
如果您可以控制字典数据,则最好使用Gilad的答案并将所有内容存储在List<MyClass>
或使用Dictionary<string, bool>
:
Dictionary<string, bool> dict = new Dictionary<string, bool>()
{
{ "Id1", true }, { "Id2", false },
};
但是,如果您没有可以控制此数据的格式并从某个地方(例如Web服务)将其作为字典获取,则可以利用.Zip
方法将该字典转换为一个匿名对象/自定义类或元组的列表,其中Item1
是Id
,而Item2
是值:
// anonymous object
var data = dict["ID"].Zip(dict["NAME"], (x, y) => new
{
ID = x,
NAME = y
}).ToList();
// tuple
// List<Tuple<object, object>> data = dict["ID"].Zip(dict["NAME"], Tuple.Create).ToList();
foreach (var obj in data)
{
Console.WriteLine(obj.ID + " " obj.NAME);
}
答案 2 :(得分:1)
其他答案可能是您应该采取的措施,以更好地构建代码。 但是,如果您需要坚持原始用例,则可以执行以下操作:
//Depending on what you're dealing with: Dictionary<string, List<string>>
Dictionary<string, List<object>> dict = new Dictionary<string, List<object>>{
{"ID", new List<object>{"Id1", "Id2"}},
{"NAME", new List<object>{"True", "False"}}
};
foreach(var v in dict.Keys){
Console.WriteLine($"{v} = {string.Join(",", dict[v])}");
}
//Output:
//ID = Id1,Id2
//NAME = True,False
答案 3 :(得分:0)
即使只有ID和Name的映射,您也可以拥有非常简单的变量
Dictionary<string,string> lookup = new Dictionary<string,string>();
lookup.Add("ID1","True")
如果Name是布尔型,则在
中将字符串替换为bool Dictionary<string,bool> lookup = new Dictionary<string,bool>();