I am working with the Exchange Web Services Managed API, with contact data. I have the following code, which is functional, but not ideal:
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...
}
As I said, this code works. Now I want to make it suck a little less, if possible.
I can't find any methods that allow me to check for the existence of the key in the dictionary before attempting to access it, and if I try to read it (with .ToString()
) and it doesn't exist then an exception is thrown:
500
The given key was not present in the dictionary.
How can I refactor this code to suck less (while still being functional)?
PhysicalAddressDictionary.TryGetValue
I use a Dictionary and because of the repetetiveness and possible missing keys, I quickly patched together a small method:
Calling it:
Gets the job done.
What is the type of
c.PhysicalAddresses
? If it'sDictionary<TKey,TValue>
, then you can use theContainsKey
method.You can use
ContainsKey
:or
TryGetValue
:Update: according to a comment the actual class here is not an
IDictionary
but aPhysicalAddressDictionary
, so the methods areContains
andTryGetValue
but they work in the same way.Example usage:
Update 2: here is the working code (compiled by question asker)
...with the inner conditional repeated as necessary for each key required. The TryGetValue is only done once per PhysicalAddressKey (Home, Work, etc).
Here is a little something I cooked up today. Seems to work for me. Basically you override the Add method in your base namespace to do a check and then call the base's Add method in order to actually add it. Hope this works for you