如何获得相应的“名称”

时间:2018-08-27 06:10:07

标签: c# dictionary

我有一个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

4 个答案:

答案 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方法将该字典转换为一个匿名对象/自定义类或元组的列表,其中Item1Id,而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>();