System.ArgumentException: "Элемент с тем же ключом уже был добавлен." Dictionary c# для System.Management
есть два метода для кнопок WPF
private void ProcessorInfo()
{
Dictionary<object, object> myPropertyResults = new Dictionary<object, object>();
ManagementClass myManagementClass = new ManagementClass("Win32_Processor");
ManagementObjectCollection myManagementCollection = myManagementClass.GetInstances();
PropertyDataCollection myProperties = myManagementClass.Properties;
foreach (var obj in myManagementCollection)
{
foreach (var myProperty in myProperties)
{
bool keyExists = myPropertyResults.ContainsKey(Name);
if (keyExists)
{
myPropertyResults.Add(myProperty.Name,
obj.Properties[myProperty.Name].Value);
}
else
{
myPropertyResults[Name] = obj.Properties[myProperty.Name].Value;
}
}
foreach (var myPropertyResult in myPropertyResults)
{
InfoList.Items.Add(myPropertyResult.Key + ":" + myPropertyResult.Value);
}
}
}
private void NetworkInfo()
{
Dictionary<object, object> myPropertyResults = new Dictionary<object, object>();
ManagementClass myManagementClass = new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection myManagementCollection = myManagementClass.GetInstances();
PropertyDataCollection myProperties = myManagementClass.Properties;
foreach (var obj in myManagementCollection)
{
foreach (var myProperty in myProperties)
{
bool keyExists = myPropertyResults.ContainsKey(Name);
if (keyExists)
{
myPropertyResults.Add(myProperty.Name,
obj.Properties[myProperty.Name].Value);
}
else
{
myPropertyResults[Name] = obj.Properties[myProperty.Name].Value;
}
}
foreach (var myPropertyResult in myPropertyResults)
{
InfoList.Items.Add(myPropertyResult.Key + ":" + myPropertyResult.Value);
}
}
}
Ошибка при вызове метода NetworkInfo();
myPropertyResults.Add(myProperty.Name, obj.Properties[myProperty.Name].Value);
Ответы (1 шт):
Вы пишете:
bool keyExists = myPropertyResults.ContainsKey(Name); if (keyExists) { myPropertyResults.Add(myProperty.Name, obj.Properties[myProperty.Name].Value); } else { myPropertyResults[Name] = obj.Properties[myProperty.Name].Value; }
Получается, у вас keyExists == true, когда в словаре уже есть Name (наверное, myProperty.Name должно быть написано?). И если есть, то вы пытаетесь добавить в словарь ключ myProperty.Name, который уже есть в словаре, и получаете ArgumentException. Попробуйте исправить условие на if (keyExists == false). И разберитесь, что у вас такое Name и как оно коррелирует с myProperty.Name. После этого можно будет дать уточненный ответ.
Видится, что весь этот кусок кода можно заменить на:
myPropertyResults[myProperty.Name] = obj.Properties[myProperty.Name].Value;
Обращение к словарю по индексу не вызывает исключения, когда такой ключ уже есть в словаре. Если таковой уже есть, для него перезаписывается значение на новое. Если же нет – создается новый с указанным значением.