【问题标题】:how to get corresponding "Name"如何获得对应的“名称”
【发布时间】:2018-08-27 06:10:07
【问题描述】:

我有一个 C# dictionary,其中我有一个对应的 NAMEID

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

【问题讨论】:

  • 对于这个任务来说,这不是一个很好的数据结构。它应该是一个单一的数组。
  • 好的,你能用一些代码解释一下吗?
  • List&lt;Dictionary&lt;string, string&gt;&gt; 会更好。表明创建一个单独的类的答案会更好
  • 甚至Dictionary&lt;string,bool&gt;
  • @user584018 GiladGreen 似乎很赚钱

标签: c# dictionary


【解决方案1】:

我认为更好的设计是创建一个具有这两个属性的类,然后进行迭代。如果您发现自己必须为简单的数据表示同步不同的数据结构,那么我建议您重新考虑设计。

public class MyClass
{
    public string Id { get; set; }
    public bool Name { get; set; }
}

然后在你迭代时持有一个List&lt;MyClass&gt;

foreach (var item in list)
{
    // Now access item.Id, item.Name
}

当您的数据有某种自然键并且您希望通过该键访问某个项目时,使用字典是很好的选择。由于项目是通过散列函数访问的,因此按键访问是在O(1) 中完成的,而在列表中搜索是O(n)。但是,在您的情况下,您在任何情况下都在迭代所有项目,因此不需要字典并将数据安排在一个类中是一个更好的设计。

关于差异和一些参考:

【讨论】:

    【解决方案2】:

    如果您确实可以控制字典数据,最好使用 Gilad 的答案并将所有内容存储在 List&lt;MyClass&gt; 或使用 Dictionary&lt;string, bool&gt;

    Dictionary<string, bool> dict = new Dictionary<string, bool>()
    {
        { "Id1", true }, { "Id2", false },
    };
    

    但是如果您没有可以控制这些数据的格式并从某个地方(例如 Web 服务)将其作为字典获取,则可以使用 .Zip 方法将此字典转换为一个列表匿名对象/自定义类或元组,其中Item1IdItem2 是值:

    // 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);
    }
    

    【讨论】:

    • 谢谢@Fabjan,我无法控制字典,您的解决方案对我来说是一种解决方法。
    • 在元组中,我可以输入data["Id1"]之类的东西吗?
    • @user584018 Tuple 基本上是一个轻量级的struct,它只包含Item1Item2 以及一些方便的方法,例如.Create。如果它确实满足您的需求,您可以使用自定义类/结构或匿名对象。
    • 好的,谢谢! @Fabjan
    【解决方案3】:

    其他答案可能是您应该做的以更好地构建您的代码。 然而,如果你需要坚持你原来的用例,你可以这样做:

    //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
    

    【讨论】:

      【解决方案4】:

      即使你只有 ID 和 Name 的映射,你也可以有非常简单的变量

        Dictionary<string,string> lookup = new Dictionary<string,string>();
        lookup.Add("ID1","True")
      

      如果 Name 是 Boolean 类型,则将字符串替换为 bool

        Dictionary<string,bool> lookup = new Dictionary<string,bool>();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多