Я работаю с управляемым 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
Данный ключ отсутствует в словаре.
Как я могу реорганизовать этот код, чтобы меньше сосать (при этом оставаясь функциональным)?
источник
TryGetValue
Подход кажется , что это может быть лучшим выбором, так как я нашел эту страницу: goo.gl/7YN6 ... но я не знаю , как использовать его. В моем коде вышеrow
это объект 'DataRow`, поэтому я не уверен, что ваш пример кода верный, хотя ...c.PhysicalAddresses.TryGetValue(c.PhysicalAddresses[PhysicalAddressKey.Home].Street, row["HomeStreet"]);
C# 7.0
)row["HomeStreet"] = c.PhysicalAddresses.TryGetValue(PhysicalAddressKey.Home, out PhysicalAddressEntry entry) ? entry.Street.ToString() : null;
Какой тип
c.PhysicalAddresses
? Если это такDictionary<TKey,TValue>
, то вы можете использоватьContainsKey
метод.источник
PhysicalAddressDictionary.TryGetValue
источник
Я использую словарь и из-за повторяемости и возможных недостающих клавиш быстро соединил небольшой метод:
Называя это:
Получает работу сделано.
источник
Вот кое-что, что я приготовил сегодня. Кажется, работает на меня. По сути, вы переопределяете метод Add в базовом пространстве имен, чтобы выполнить проверку, а затем вызываете базовый метод Add, чтобы фактически добавить его. Надеюсь, что это работает для вас
источник