snippetcsharpCritical
How can I detect if this dictionary key exists in C#?
Viewed 0 times
keyhowdetectexistscandictionarythis
Problem
I am working with the Exchange Web Services Managed API, with contact data. I have the following code, which is functional, but not ideal:
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
500
The given key was not present in the dictionary.
How can I refactor this code to suck less (while still being functional)?
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)?
Solution
You can use
or
Update: according to a comment the actual class here is not an
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).
ContainsKey:if (dict.ContainsKey(key)) { ... }or
TryGetValue:dict.TryGetValue(key, out value);Update: according to a comment the actual class here is not an
IDictionary but a PhysicalAddressDictionary, so the methods are Contains and TryGetValue but they work in the same way.Example usage:
PhysicalAddressEntry entry;
PhysicalAddressKey key = c.PhysicalAddresses[PhysicalAddressKey.Home].Street;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
row["HomeStreet"] = entry;
}Update 2: here is the working code (compiled by question asker)
PhysicalAddressEntry entry;
PhysicalAddressKey key = PhysicalAddressKey.Home;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
if (entry.Street != null)
{
row["HomeStreet"] = entry.Street.ToString();
}
}...with the inner conditional repeated as necessary for each key required. The TryGetValue is only done once per PhysicalAddressKey (Home, Work, etc).
Code Snippets
if (dict.ContainsKey(key)) { ... }dict.TryGetValue(key, out value);PhysicalAddressEntry entry;
PhysicalAddressKey key = c.PhysicalAddresses[PhysicalAddressKey.Home].Street;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
row["HomeStreet"] = entry;
}PhysicalAddressEntry entry;
PhysicalAddressKey key = PhysicalAddressKey.Home;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
if (entry.Street != null)
{
row["HomeStreet"] = entry.Street.ToString();
}
}Context
Stack Overflow Q#2829873, score: 1128
Revisions (0)
No revisions yet.