如何檢測C#中是否存在此字典密鑰?

我正在使用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


#1樓

PhysicalAddressDictionary.TryGetValue get

public bool TryGetValue (
    PhysicalAddressKey key,
    out PhysicalAddressEntry physicalAddress
     )

#2樓

c.PhysicalAddresses的類型是c.PhysicalAddresses ? 若是它是Dictionary<TKey,TValue> ,那麼您可使用ContainsKey方法。 webservice


#3樓

您可使用ContainsKeystring

if (dict.ContainsKey(key)) { ... }

TryGetValueit

dict.TryGetValue(key, out value);

更新 :根據註釋,這裏的實際類不是IDictionary而是PhysicalAddressDictionary ,所以方法是ContainsTryGetValue但它們以相同的方式工做。 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。


#4樓

這是我今天作的一些東西。 彷佛爲我工做。 基本上,您覆蓋基本命名空間中的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());
        }
    }
}

#5樓

我使用一個字典,因爲重複性和可能丟失的密鑰,我很快拼湊了一個小方法:

private static string GetKey(IReadOnlyDictionary<string, string> dictValues, string keyValue)
 {
     return dictValues.ContainsKey(keyValue) ? dictValues[keyValue] : "";
 }

打電話給:

var entry = GetKey(dictList,"KeyValue1");

完成工做。

相關文章
相關標籤/搜索