Подтвердить что ты не робот

Как инициализировать словарь, содержащий списки словарей?

Я начинаю немного развиваться в С#, и у меня здесь проблема. Обычно я разрабатываю в Python, где такие вещи, как это, реализуются легко (по крайней мере для меня), но я понятия не имею, как это сделать на С#:

Я хочу создать словарь, содержащий список словарей, подобных следующим: Generic Collections:

{ "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;

Но тогда я хотел бы сразу вставить три записи сверху. Я застрял с синтаксическими ошибками.

У кого-нибудь есть решение для меня?

Edit:

Спасибо всем - я не ожидал получить так много хорошо продуманных ответов за такое короткое время! Ты прекрасна!

4b9b3361

Ответ 1

Вы можете использовать словарь . Не такой элегантный, как 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();

Следует отметить, что использование коллекций не будет столь же быстрым, как поиск в хэш-таблице, но в зависимости от ваших потребностей с точки зрения производительности вы также можете жить с этим.

Ответ 2

ИМХО - более элегантный способ сделать это в С#, , чтобы избежать использования Словаря, С# имеет лучшие варианты, чем это,

должен создать класс (или struct), например Person

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;

Ответ 3

Вы можете легко сделать это:

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

Вам было бы лучше использовать типизированный человек, или 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 }}
     };