Pracuję z interfejsem API Exchange Web Services Managed API z danymi kontaktowymi. Mam następujący kod, który jest funkcjonalny , ale nie idealny:
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...
}
Jak powiedziałem, ten kod działa . Teraz chcę , jeśli to możliwe, trochę mniej ssać .
Nie mogę znaleźć żadnych metod, które pozwolą mi sprawdzić istnienie klucza w słowniku przed próbą uzyskania do niego dostępu, a jeśli spróbuję go odczytać (za pomocą .ToString()
) i nie istnieje, zgłoszony zostanie wyjątek:
500
Dany klucz nie był obecny w słowniku.
Jak mogę zmienić kod tego kodu, aby mniej ssał (nadal działając)?
źródło
TryGetValue
Podejście wydaje się, może to być najlepszym, ponieważ znalazłem tę stronę: goo.gl/7YN6 ... ale nie jestem pewien, jak go używać. W moim powyższym kodzierow
znajduje się obiekt „DataRow”, więc nie jestem pewien, czy twój przykładowy kod ma rację, ale ...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;
Jaki to rodzaj
c.PhysicalAddresses
? Jeśli takDictionary<TKey,TValue>
, możesz użyć tejContainsKey
metody.źródło
PhysicalAddressDictionary.TryGetValue
źródło
Używam słownika, a ze względu na powtarzalność i możliwe brakujące klucze szybko połączyłem małą metodę:
Nazywając to:
Wykonuje zadanie.
źródło
Oto coś, co dzisiaj ugotowałem. Wydaje się dla mnie pracować. Zasadniczo zastępujesz metodę Add w swojej podstawowej przestrzeni nazw, aby wykonać sprawdzenie, a następnie wywołujesz metodę Add bazy, aby faktycznie ją dodać. Mam nadzieję, że to Ci odpowiada
źródło