Список, содержащий словарь, содержащий список - PullRequest
1 голос
/ 08 марта 2012

Вопрос

Мне нужна структура данных, подобная описанной выше, в C #, но у меня возникают проблемы с доступом к содержимому, я видел, что могу сделать это в C ++, как то же самое делается в c #?

List<Dictionary<string, List<int>>> data = 
new List<Dictionary<string, List<int>>>(5);

когда я делаю данные [0], я получаю сообщение об ошибке, указывающее индекс за пределами границ.

Может кто-нибудь указать мне, как я могу это сделать. или что я делаю не так?

Добавление:

-> Что я пытаюсь сделать

Я в основном создаю структуру данных, которая поддерживает план месяца. Итак, список из 5 недель, каждая из которых содержит-> Словарь действий, где значение для каждого действия -> список из 7 целых чисел, представляющих часы, потраченные каждый день недели на эту деятельность.

Я получил, что мне нужно добавить пустые записи. Дополнительный вопрос такой:

-> Запрос

Прямо сейчас мне нужно будет добавить 5 пустых словарей в список. и список из 7 целых чисел (инициализированный в ноль) в каждом ключе словаря, представляющий каждый потребляемый день.

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

Заявление, подобное

Vector<int> *vec = new Vector<int>(5,0);

Инициализировал vec с 5 записями, каждая из которых равна 0. Могу ли я сделать то же самое в c #?

Спасибо за помощь.

Ответы [ 2 ]

11 голосов
/ 08 марта 2012

Это не имеет ничего общего со списком, являющимся сложным типом. Вы получите то же самое с этим:

List<string> list = new List<string>(5);
string x = list[0]; // This will fail too

Конструктор List<T>(int) создает список с заданной емкостью (т. Е. Массив, поддерживающий его, будет иметь начальный размер 5, предполагая, что это не слишком маленький, чтобы быть полезным). Он по-прежнему имеет размер , равный 0.

Вам все еще нужно добавить элементы в список, прежде чем вы сможете получить к ним доступ.

РЕДАКТИРОВАТЬ: Там нет конструктора, чтобы "заполнить" список с заданным набором значений. С помощью LINQ вы можете написать:

List<string> list = Enumerable.Repeat("foo", 5).ToList();

... но вы не захотите сделать это для своего словаря, иначе вы получите 5 ссылок на один и тот же словарь. Вы можете использовать:

var list = Enumerable.Range(0, 5)
                     .Select(x => new Dictionary<string, List<int>>())
                     .ToList();

Обратите внимание, что каждый словарь здесь пуст.

Лично я бы вероятно просто создал бы список и заполнил его циклом for ...

2 голосов
/ 08 марта 2012

Вы инициализировали список с размером по умолчанию 5, но список все еще пуст, поэтому при попытке доступа к индексу 0 в объекте данных он выходит за пределы, поскольку текущее количество элементов в списке 0, следовательно, нет объектов для доступа.

если вы добавляете новый элемент данных, с помощью data.Add (...) вы можете получить доступ к объекту по первому индексу с данными [0]

...