Как инициализировать словарь, содержащий списки словарей?
Я начинаю немного развиваться в С#, и у меня здесь проблема. Обычно я разрабатываю в 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:
Спасибо всем - я не ожидал получить так много хорошо продуманных ответов за такое короткое время! Ты прекрасна!
Ответы
Ответ 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 }}
};