Экземпляр со словарем - PullRequest
2 голосов
/ 02 апреля 2012

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

Прежде всего.У меня на сервере есть словарь:

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) из первой части.

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

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

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

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

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

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

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

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

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 голосов
/ 02 апреля 2012

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

 Dictionary<int, List<string>> dictName = new Dictionary<int, List<string>>();
 dictName.Add(0, null);
 dictName[0] = new List<string>();
 dictName[0].Add("Hello");
0 голосов
/ 02 апреля 2012

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

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

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

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

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

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)
    {
        ...
    }
}
...