我正在使用Exchange Web服務託管API和聯繫人數據。 我有如下代碼,它是功能性的 ,但並不理想: web
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... }
正如我所說,這段代碼有效 。 若是可能的話,如今我想減小一點 。 spa
我找不到任何容許我在嘗試訪問它以前檢查字典中是否存在密鑰的方法,若是我嘗試讀取它(使用.ToString()
)而且它不存在則會出現異常拋出: code
500
給定的密鑰不在字典中。 orm
我怎樣才能重構這段代碼以減小(儘管仍在運行)? ip
PhysicalAddressDictionary.TryGetValue get
public bool TryGetValue ( PhysicalAddressKey key, out PhysicalAddressEntry physicalAddress )
c.PhysicalAddresses
的類型是c.PhysicalAddresses
? 若是它是Dictionary<TKey,TValue>
,那麼您可使用ContainsKey
方法。 webservice
您可使用ContainsKey
: string
if (dict.ContainsKey(key)) { ... }
或TryGetValue
: it
dict.TryGetValue(key, out value);
更新 :根據註釋,這裏的實際類不是IDictionary
而是PhysicalAddressDictionary
,所以方法是Contains
和TryGetValue
但它們以相同的方式工做。 io
用法示例:
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(); } }
...根據須要爲每一個鍵重複內部條件。 每一個PhysicalAddressKey(Home,Work等)只執行一次TryGetValue。
這是我今天作的一些東西。 彷佛爲我工做。 基本上,您覆蓋基本命名空間中的Add方法以進行檢查,而後調用base的Add方法以實際添加它。 但願這對你有用
using System; using System.Collections.Generic; using System.Collections; namespace Main { internal partial class Dictionary<TKey, TValue> : System.Collections.Generic.Dictionary<TKey, TValue> { internal new virtual void Add(TKey key, TValue value) { if (!base.ContainsKey(key)) { base.Add(key, value); } } } internal partial class List<T> : System.Collections.Generic.List<T> { internal new virtual void Add(T item) { if (!base.Contains(item)) { base.Add(item); } } } public class Program { public static void Main() { Dictionary<int, string> dic = new Dictionary<int, string>(); dic.Add(1,"b"); dic.Add(1,"a"); dic.Add(2,"c"); dic.Add(1, "b"); dic.Add(1, "a"); dic.Add(2, "c"); string val = ""; dic.TryGetValue(1, out val); Console.WriteLine(val); Console.WriteLine(dic.Count.ToString()); List<string> lst = new List<string>(); lst.Add("b"); lst.Add("a"); lst.Add("c"); lst.Add("b"); lst.Add("a"); lst.Add("c"); Console.WriteLine(lst[2]); Console.WriteLine(lst.Count.ToString()); } } }
我使用一個字典,因爲重複性和可能丟失的密鑰,我很快拼湊了一個小方法:
private static string GetKey(IReadOnlyDictionary<string, string> dictValues, string keyValue) { return dictValues.ContainsKey(keyValue) ? dictValues[keyValue] : ""; }
打電話給:
var entry = GetKey(dictList,"KeyValue1");
完成工做。