1. ホーム
  2. c#

[解決済み] C#でこの辞書のキーが存在するかどうかを検出するにはどうすればよいですか?

2022-03-17 07:40:36

質問

Exchange Web Services Managed 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);


更新情報 : コメントによると、この実際のクラスは IDictionary でなく 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など)ごとに1回だけ実行されます。