我正在使用Exchange Web服务管理API,使用联系人数据。我有以下代码,这是功能性的,但不理想:
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
给定的键在字典中不存在。
我该如何重构这段代码来减少吸吮(同时仍然具有功能性)?
你可以使用ContainsKey:
if (dict.ContainsKey(key)) { ... }
或TryGetValue:
dict.TryGetValue(key, out value);
更新:根据注释,这里的实际类不是一个字典,而是一个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等)执行一次。
你可以使用ContainsKey:
if (dict.ContainsKey(key)) { ... }
或TryGetValue:
dict.TryGetValue(key, out value);
更新:根据注释,这里的实际类不是一个字典,而是一个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等)执行一次。