586

連絡先データを使用して、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
指定されたキーはディクショナリに存在しませんでした。

このコードをリファクタリングして、(まだ機能している間)吸う回数を減らすにはどうすればよいですか?

4

5 に答える 5

1029

使用できますContainsKey

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

またはTryGetValue:

dict.TryGetValue(key, out value);

更新:コメントによると、ここの実際のクラスは anIDictionaryではなく aPhysicalAddressDictionaryであるため、メソッドはContainsandTryGetValueですが、同じように機能します。

使用例:

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 (自宅、職場など) ごとに 1 回だけ実行されます。

于 2010-05-13T20:01:29.333 に答える
15

の型はc.PhysicalAddresses何ですか? の場合Dictionary<TKey,TValue>は、メソッドを使用できますContainsKey

于 2010-05-13T20:00:19.513 に答える
6

私はディクショナリを使用していますが、反復性とキーの欠落の可能性があるため、すぐに小さな方法にパッチを当てました。

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

それを呼び出す:

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

仕事を終わらせます。

于 2018-09-17T08:16:20.367 に答える
5

PhysicalAddressDictionary.TryGetValue

 public bool TryGetValue (
    PhysicalAddressKey key,
    out PhysicalAddressEntry physicalAddress
     )
于 2010-05-13T20:00:19.087 に答える