如何初始化包含字典列表的字典

本文关键字:字典 列表 包含 初始化 | 更新日期: 2023-09-27 18:08:50

我开始用c#做一点开发,我在这里遇到了一个问题。通常我在Python中开发,这样的东西很容易实现(至少对我来说),但我不知道如何在c#中做到这一点:

我想使用泛型集合创建一个包含如下字典列表的字典:

{ "alfred",  [ {"age", 20.0}, {"height_cm", 180.1} ],
  "barbara", [ {"age", 18.5}, {"height_cm", 167.3} ],
  "chris",   [ {"age", 39.0}, {"height_cm", 179.0} ]
}

开头:

using System.Collections.Generic;
Dictionary<String, Dictionary<String, double>[]> persons;

但是接下来我想把上面的三条记录同时插入到persons中。我一直被语法错误所困扰。

谁能给我一个解决方案?

编辑:

谢谢大家——我没想到在这么短的时间内收到这么多深思熟虑的答案!你太棒了!

如何初始化包含字典列表的字典

可以使用字典初始化。没有Python那么优雅,但可以使用:

var persons = new Dictionary<string, Dictionary<string, double>>
{
    { "alfred", new Dictionary<string, double> { { "age", 20.0 }, { "height_cm", 180.1 } } },
    { "barbara", new Dictionary<string, double> { { "age", 18.5 }, { "height_cm", 167.3 } } },
    { "chris", new Dictionary<string, double> { { "age", 39.0 }, { "height_cm", 179.0 } } }
};

然后:

persons["alfred"]["age"];

还需要注意的是,这个结构需要Dictionary<string, Dictionary<string, double>>,而不是Dictionary<string, Dictionary<string, double>[]>

使用这样的结构可能会有一点PITA,并且会损害代码的可读性和编译时类型安全性。

在。net中更倾向于使用强类型对象,像这样:

public class Person
{
    public double Age { get; set; }
    public string Name { get; set; }
    public double HeightCm { get; set; }
}

然后:

var persons = new[]
{
    new Person { Name = "alfred", Age = 20.0, HeightCm = 180.1 },
    new Person { Name = "barbara", Age = 18.5, HeightCm = 180.1 },
    new Person { Name = "chris", Age = 39.0, HeightCm = 179.0 },
};

,然后你可以使用LINQ来获取你需要的任何信息:

double barbarasAge = 
    (from p in persons
     where p.Name == "barbara"
     select p.Age).First();

当然,需要注意的是,使用集合不会像查找哈希表那么快,但根据您在性能方面的需求,您也可以使用它。

您可以很容易地做到这一点:

 Dictionary<string, Dictionary<string, double>> dict =  
                       new Dictionary<string,Dictionary<string, double>>() {
     {"alfred",new Dictionary<string,double>() {{"age",20.0},{"height":180.1}}},
     {"barbara",new Dictionary<string,double>() {{"age",18.5},{"height": 167.3}}}
 };

您最好使用类型化的person,或者使用ExpandoObject来提供对字典的类型化语法访问。

Dictionary<string, Person> dict = new Dictionary<string,Person>() {
         {"alfred",new Person { age=20.0 ,height=180.1 }},
         {"barbara",new Person { age=18.5,height=167.3 }}
     };

在c#中更优雅的方法是,避免使用字典, c#有更好的选择,

是创建一个像Person

一样的(或struct)
public class Person 
{
    public Person() { }
    public string Name {get;set;}
    public int Age {get;set;}
    public double Height {get;set;}
}

并将这些对象放入实现IEnumerable

的泛型列表或集合中
public List<Person>;

用Linq找到你想要的人

var personToLookfor =
    from p in people
    where p.Name == "somename"
    select p;