Как я могу определить, существует ли этот ключ словаря в С#?

Я работаю с управляемым 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.