Как инициализировать словарь, содержащий списки словарей? - PullRequest
25 голосов
/ 18 сентября 2011

Я начинаю немного заниматься разработкой на 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;

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

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

Изменить:

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

Ответы [ 3 ]

46 голосов
/ 18 сентября 2011

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

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

3 голосов
/ 18 сентября 2011

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

 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 }}
     };
3 голосов
/ 18 сентября 2011

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

предназначен для создания класса (или структуры) типа 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...