Как я могу определить, существует ли этот ключ словаря в С#?
Я работаю с управляемым API веб-служб Exchange с контактными данными. У меня есть следующий код, который является функциональным, но не идеальным:
foreach (Contact c in contactList)
{
string openItemUrl = "https://" + service.Url.Host + "/owa/" + c.WebClientReadFormQueryString;
row = table.NewRow();
row["FileAs"] = c.FileAs;
row["GivenName"] = c.GivenName;
row["Surname"] = c.Surname;
row["CompanyName"] = c.CompanyName;
row["Link"] = openItemUrl;
//home address
try { row["HomeStreet"] = c.PhysicalAddresses[PhysicalAddressKey.Home].Street.ToString(); }
catch (Exception e) { }
try { row["HomeCity"] = c.PhysicalAddresses[PhysicalAddressKey.Home].City.ToString(); }
catch (Exception e) { }
try { row["HomeState"] = c.PhysicalAddresses[PhysicalAddressKey.Home].State.ToString(); }
catch (Exception e) { }
try { row["HomeZip"] = c.PhysicalAddresses[PhysicalAddressKey.Home].PostalCode.ToString(); }
catch (Exception e) { }
try { row["HomeCountry"] = c.PhysicalAddresses[PhysicalAddressKey.Home].CountryOrRegion.ToString(); }
catch (Exception e) { }
//and so on for all kinds of other contact-related fields...
}
Как я уже сказал, этот код работает. Теперь я хочу сделать это, если это возможно, немного меньше.
Я не могу найти какие-либо методы, которые позволят мне проверить наличие ключа в словаре, прежде чем пытаться получить к нему доступ, и если я попытаюсь его прочитать (с помощью .ToString()
), и он не существует, генерируется исключение:
500
Указанный ключ отсутствовал в словаре.
Как я могу реорганизовать этот код, чтобы сосать меньше (пока он все еще функционирует)?
Ответы
Ответ 1
Вы можете использовать ContainsKey
:
if (dict.ContainsKey(key)) { ... }
или TryGetValue
:
dict.TryGetValue(key, out value);
Обновить: согласно комментарию, фактический класс здесь не является IDictionary
, а PhysicalAddressDictionary
, поэтому методы Contains
и TryGetValue
но они работают одинаково.
Пример использования:
PhysicalAddressEntry entry;
PhysicalAddressKey key = c.PhysicalAddresses[PhysicalAddressKey.Home].Street;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
row["HomeStreet"] = entry;
}
Обновление 2: вот рабочий код (скомпилированный вопросчиком)
PhysicalAddressEntry entry;
PhysicalAddressKey key = PhysicalAddressKey.Home;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
if (entry.Street != null)
{
row["HomeStreet"] = entry.Street.ToString();
}
}
... с внутренним условным повторением, необходимым для каждой требуемой клавиши. TryGetValue выполняется только один раз в PhysicalAddressKey (Home, Work и т.д.).
Ответ 2
Каков тип c.PhysicalAddresses
? Если он Dictionary<TKey,TValue>
, вы можете использовать метод ContainsKey
.
Ответ 3
PhysicalAddressDictionary.TryGetValue
public bool TryGetValue (
PhysicalAddressKey key,
out PhysicalAddressEntry physicalAddress
)