[解決済み] 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回だけ実行されます。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] ランダムな英数字の文字列を生成するにはどうすればよいですか?
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] UnixのタイムスタンプをDateTimeに、またはその逆に変換するにはどうすればよいですか?
-
[解決済み] アセンブリファイルのバージョンを取得する方法
-
[解決済み] C#でDictionaryに格納された値を更新する方法は?
-
[解決済み] 辞書のキーを値で取得する
-
[解決済み】foreachループで辞書の値を編集する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である