Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何初始化包含词典列表的词典?_C#_Dictionary - Fatal编程技术网

C# 如何初始化包含词典列表的词典?

C# 如何初始化包含词典列表的词典?,c#,dictionary,C#,Dictionary,我开始在C#中进行一些开发,我遇到了一个问题。通常我在Python中开发,这样的东西很容易实现(至少对我来说),但我不知道如何在C#中实现: 我想创建一个字典,其中包含使用通用集合的字典列表,如下所示: { "alfred", [ {"age", 20.0}, {"height_cm", 180.1} ], "barbara", [ {"age", 18.5}, {"height_cm", 167.3} ], "chris", [ {"age", 39.0}, {"height_c

我开始在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;
使用System.Collections.Generic;
词典编纂者;
但是我想把上面的三条记录同时插入到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 } } }
};
还请注意,此结构需要
字典
,而不是
字典

使用这种结构也可能会产生一些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();

当然需要注意的是,使用集合的速度不如哈希表查找快,但根据您在性能方面的需要,您也可以接受它。

我想,在c#中使用更优雅的方法是什么,为了避免使用字典,c#有更好的选择

是创建一个类(或结构),如
Person

public class Person 
{
    public Person() { }

    public string Name {get;set;}
    public int Age {get;set;}
    public double Height {get;set;}
}
并将这些对象放入实现


您可以轻松做到这一点:

 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}}}
 };
Dictionary dict=
新字典(){
{“阿尔弗雷德”,新词典(){{“年龄”,20.0},{“身高”:180.1},
{“芭芭拉”,新词典(){{“年龄”,18.5},{“身高”:167.3}
};
不过,最好使用类型化的person,或者使用一个为字典提供类型化语法访问权限的

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 }}
     };
Dictionary dict=new Dictionary(){
{“阿尔弗雷德”,新人{年龄=20.0,身高=180.1},
{“芭芭拉”,新人{年龄=18.5,身高=167.3}
};

您的主要问题是希望用C#编写python。C#主要是静态类型的,您应该利用它。您可以使用
dynamic
和类似expando对象的东西来获得类似于动态类型语言的行为。但是,惯用C#使用静态类型化和定义成员的类,而不是字典。您的外部字典很好,内部字典很难看,因为它应该是一个类。+1我建议使用类型别名,例如
using MyDict=System.Collections.Generic.dictionary?@Ani,是的,你可以。实际上,我建议使用
Person
类而不是字典。我可以建议不要使用类型别名吗?我更喜欢
使用System.Collections.Generic
。为什么“避免…字典”类是一个可取的目标?因为OP的问题不是键值关系嵌套字典本质上是一件坏事?
var personToLookfor =
    from p in people
    where p.Name == "somename"
    select p;
 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}}}
 };
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 }}
     };