2012-04-02 6 views
2

В настоящее время я работаю над проектом, который создает словарь с индексом int экземпляра и сложным типом в качестве значения. Поскольку это огромный школьный проект, я не хочу размещать тонну кода, поскольку у меня есть логическая проблема, а не «мне нужен код». Я постараюсь быть настолько ясным, насколько смогу, и если есть что-то, что мне нужно объяснить, пожалуйста, дайте мне знать.Instancing со словарем

Во-первых. У меня есть словарь на моем сервере:

private Dictionary<int,List<complexType>> dictName = new Dictionary<int,List<complexType>> 

Каждый раз, когда клиент запускается он регистрируется в словаре (я создать пустой сложный тип, чтобы создать его экземпляр, то я загрузить словарь):

List<complexType> temp = null; 
dictName.Add(id,temp) 

Тогда, когда придет время, что я хочу, чтобы добавить в список для конкретного экземпляра, что я делаю это:

complexType myItem = new complexType(); 
dictName[id].Add(myItem); 

когда я запускаю этот код, я получаю сообщение об ошибке, когда второй клиент пытается запустить:

«Необработанное исключение типа '' System.Reflection.TargetInvocationException произошло в mscorlib.dll. Дополнительная информация: Исключение было выбрано мишенью вызова.

Теперь это происходит, когда ударяет второй пользователь: dictName.Add(id,temp) из первой части.

Если я изменить экземпляр температуры на List<complexType> temp = new List<complexType>();

затем он проходит это место, но я получаю ту же ошибку снова, когда он обновляет клиент.

В настоящее время я использую этот способ передачи данных с помощью int и string (dictionary) , и они отлично работают, но когда я добавил в список сложного типа в словаре, я получил вышеуказанную ошибку.

Если у кого-то есть предложения, я был бы очень признателен. Я надеюсь, что это связано с моей начальной загрузкой пустого списка. Если есть что-то еще, что вам нужно знать, пожалуйста, спросите спасибо!

+2

Что это исключение? Исправленное исключение * должно иметь свойство InnerException. Вы можете сказать нам, что это такое? – spender

+0

@spender Я посмотрел, и похоже, что у него нет ... когда я отлаживаю его, просто случайно выдает оператор break с исключением, которое я показал выше. Затем он открывает вкладку, в которой не указывается источник. Я также попытался вставить попытку catch, чтобы получить информацию, но он не входит в catch – user1219627

+0

Вы пытаетесь получить к нему доступ из разных потоков? –

ответ

1

Вы делаете словарь списков.Таким образом, вы пытались добавить в список, который был нулевым, и именно это дало вам первое исключение.

Во-вторых, я никогда не видел «новый частный словарь» - это опечатка для вырезания и вставки?

Это работает:

Dictionary<int, List<string>> dictName = new Dictionary<int, List<string>>(); 
dictName.Add(0, new List<string>()); 
dictName[0].Add("First"); 
dictName.Add(1, new List<string>()); 
dictName[1].Add("Second"); 

Тот факт, что у вас есть список сложного типа и у меня есть список строк, не имеет значения.

0

Похоже, вы должны инициализировать словарь запись как:

dictName.Add(id, new List<complexType>()); 

Вы также можете попробовать использовать общий тип поиска, который является в основном именно то, что вам нужно - ключ к списку значений.

var lookupName = new Lookup<int, complexType>(); 

lookup.Add(id, new complexType()); // Creates key 'id' and adds new ct. 
lookup.Add(id, new complexType()); // Adds new ct to existing key 'id' 
lookup.Add(651, null); // Creates key 651 and adds null 

Таким образом, вы можете просто использовать метод добавления, чтобы добавить сложные экземпляры типа с идентификатором ключа, даже не задумываясь о том, имеет ли ключ или нет.

lookup[id] 

Вернет вам IEnumerable сложных типов, связанных с данным идентификатором.

Пример:

var lu = new Lookup<int, string>(); 

lu.Add(7, "Seven"); 
lu.Add(7, "SEVEN"); 
lu.Add(4, "Four"); 
lu.Add(7, "7"); 
lu.Add(4, "FOUR"); 
lu.Add(4, "FOUR"); 

Console.WriteLine(string.Join(", ", lu[7])); // "Seven, SEVEN, 7" 
Console.WriteLine(string.Join(", ", lu[4])); // "Four, FOUR, FOUR" 

foreach (var grp in lu) 
{ 
    int id = grp.Key; 

    foreach (var str in grp) 
    { 
     ... 
    } 
} 
+0

Я меняю установку, но когда я делаю «dictName [id] .Add (myItem)« Я хочу добавить в список для этого идентификатора, а не создавать новый список каждый раз, если я не злоупотребляю вашим кодом. – user1219627

+0

Lookup имеет список для каждого ключа, и когда вы используете метод add, как я показал, он создает новый ключ и список, если ключ не существует, и добавляет в существующий список, если он это делает. Попробуйте. – SimpleVar

+0

@ user1219627 Я добавил еще один пример того, как использовать Lookup. – SimpleVar

0

Попробуйте так:

Dictionary<int, List<string>> dictName = new Dictionary<int, List<string>>(); 
dictName.Add(0, null); 
dictName[0] = new List<string>(); 
dictName[0].Add("Hello"); 
Смежные вопросы