2013-10-03 5 views
0

Я пытаюсь создать и заполнить словарь, содержащий список как его значение; т.е.Добавление списков в словарь вложенного списка

Dictionary <string, List<string>> DictionaryA = new Dictionary<string,List<string>>(); 

Значения в словаре затем будут выводиться в электронную таблицу Excel.

Проблема возникает, когда я пытаюсь вводить списки в словарь под ключом. Первое назначение словаря прекрасное, например, список из 10 строк под ключом «Key1».

Dictionary <string, List<string>> DictionaryA = new Dictionary<string, List<string>>(); 
int i = 0; 
while(page.MoveNext()) //For example, for each page in a book 
{ 
    while(words.MoveNext()) //For example, words in the page 
    { 
    if(!(ListA.Contains(ValueA)) //For example, we are looking to store instances of each word in each page of a book 
    { 
     ListA.Add(ValueA); 
    } 
    DictionaryA.Add(i, ListA); 
    i++; 
    } 

    sortedList = DictionaryA.Keys.ToList(); //Let's say we want to sort the Dictionary as well 
    sortedList.Sort() 

    foreach (var key in sortedList) 
    { 
    DictionaryASorted.Add(key, DictionaryA[key]); 
    } 

    ExcelOuput(DictionaryASorted); //Function to export and save an Excel File 
} 

Таким образом, первый прогон через page.Movenext() цикл хорошо, словарь правильно заполнен список. Однако при втором прохождении цикла в список «ListA» добавляется любая уникальная «ValueA» - это изменяет «ListA», который уже хранится в словаре. Конечным результатом является словарь, который содержит разные номера страниц в качестве ключей и тот же самый огромный список слов для каждого из этих ключей.

Если я использую ListA.Clear() в начале каждого цикла страниц, список заканчивается словами из последней прочитанной страницы и ничего больше.

Как использовать этот вложенный список без изменения предыдущего списка? Я пытаюсь сделать это правильно? Или есть лучшее, более элегантное решение?

ответ

0

Вам необходимо создать новый список в цикле.

Так, чуть выше while(words.MoveNext())

Понадобится:

List<string> ListA = new List<string>(); 

Это создаст новый список для вас, чтобы заполнить. Вы должны понимать, что словарь и ListA оба указывают на один и тот же список. Добавление или очистка списка делает то же самое со списком словесных предложений. Вам нужно создать новый список для каждого значения словаря.

+0

Это именно то, что мне нужно, спасибо большое! Почему я этого раньше не видел ?! Г! – Eomo

+0

@Eomo Classic выпуск. Не чувствую себя плохо. Трудно сказать, когда переменная передается по значению или по ссылке, когда вы добавляете ее к другому объекту. – Vulcronos

Смежные вопросы