こんにちは!
なかむぅです。
C#のコードを読んでいるとTryGetValue(TKey key, out TValue value)
というものがでてきて
となったので調べてみました。
私が働く会社では、一緒に働いてくれるエンジニアを募集しています♪
- 未経験、第二新卒歓迎
- 学歴・転職回数・離職期間不問
- 残業は月15時間以下で残業代は全額支給
- 経験者は月給23万円以上
- 年収100万以上UP↑↑↑も可能
- 長く働いていても年収が全然上がらないから、一気に年収を上げたい
- 残業をしたくてしているわけではないので、残業代はしっかりと出して欲しい
- やりたいことに挑戦させてもらえないから、自分がしてみたいことに挑戦したい
- 通勤時間が長すぎるから、できるだけ短くしたい
- もっと勉強したいから、書籍代など負担してくれるところに入りたい
- 現場に駆り出されてからは放置プレイで、相談できる人も先輩も居ないので、自分の状況をちゃんと理解してくれるところで働きたい
上記内容に1つでも当てはまる場合は、ぜひご検討ください。
結論、TryGetValueはKeyの存在チェックするついでに値が取れる
TryGetValue
はDictionaryクラスにあるKeyの存在チェックができ、さらに値まで取れちゃうメソッドでした。
TryGetValue
で「値が取得できるかどうか」ですね。
元をたどっていくとTryGetValue
が使用されている変数やプロパティはDictionary型になっていると思います。
TryGetValueの使い方
- hogeをキーに持つ値が入っているhogeDictionary
- piyoをキーに持つ値が入っているpiyoDictionary
といった二つのDictionary
を用意しました。
この二つのDictionary
を「hoge」、「piyo」それぞれのKey名でチェックします。
static void Main(string[] args)
{
// hogeをキーに持つ値が入っているhogeDictionary
var hogeDictionary = new Dictionary<string, string>();
hogeDictionary.Add("hoge", "hogehoge");
// piyoをキーに持つ値が入っているpiyoDictionary
var piyoDictionary = new Dictionary<string, string>();
piyoDictionary.Add("piyo", "piyopiyo");
Console.WriteLine("hogeDictionaryを調べます");
CheckKey(hogeDictionary);
Console.WriteLine("piyoDictionaryを調べます");
CheckKey(piyoDictionary);
}
// hoge、piyoそれぞれのKey名でチェックする
private static void CheckKey(Dictionary<string, string> dictionary)
{
if (dictionary.TryGetValue("hoge", out string hogeValue))
{
Console.WriteLine($"「hoge」のKeyには「{hogeValue}」が入っています");
}
else
{
Console.WriteLine($"「hoge」のKeyには何も入っていません");
}
if (dictionary.TryGetValue("piyo", out string piyoValue))
{
Console.WriteLine($"「piyo」のKeyには「{piyoValue}」が入っています");
}
else
{
Console.WriteLine($"「piyo」のKeyには何も入っていません");
}
Console.WriteLine();
}
HogeDictionaryを調べます
「hoge」のKeyには「hogehoge」が入っています
「piyo」のKeyには何も入っていません
piyoDictionaryを調べます
「hoge」のKeyには何も入っていません
「piyo」のKeyには「piyopiyo」が入っています
想定通りの結果になりました。
通常、Dictionaryの値を取得するときは、以下のコードのようにKeyを指定してあげないと取得できません。
var hogeDictionary = new Dictionary<string, string>();
hogeDictionary.Add("hoge", "hogehoge");
var hoge = dictionary["hoge"];
しかし、TryGetValue
は引数にKeyと代入したい変数をout
で渡すことで、out
で渡した変数についでに値を入れてくれるといった便利なメソッドでした。
out
で渡した引数の変数はif分の外でも使えるので、否定演算子でKeyが存在しないときは例外を出すといったような処理もできますね!
if (!dictionary.TryGetValue("hoge", out string value))
{
throw new Exception();
}
var hoge = value;
Dictionaryクラスには他にもContainsKey
というKeyをチェックできるメソッドがありますが、Keyの存在チェックのみなので、以下のようにKey名を指定した値の取り方をしないといけません。
var hoge = "";
if (dictionary.ContainsKey("hoge"))
{
hoge = dictionary["hoge"];
}
詳しくはこちらの記事に記載していますので、参考にしてください。

default値をセットできる拡張メソッドを作る
記事を漁っていると、以下の記事に良さげな拡張メソッドが紹介されていたのでメモ書き。
TryGetValue
を使ってKeyの存在チェックをしたとき、Keyが存在しない場合は型のdefault
値が返ってくる。
その時、stringや参照型だとnull
が返ってくるので、値を代入してあげる必要が出てくる場面もあると思います。
(Value値がint
のときは0
、bool
のときはfalse
なので、あまり必要ないのかも)
var hoge = "";
if (dictionary.TryGetValue("hoge", out string value))
{
// Keyがあったときは返ってきたvalueを使う
hoge = value;
}
else
{
// Keyがなかったときは、default値だとnullや0になるので初期値を入れる
hoge = "hogehoge";
}
var hoge = "";
if (!dictionary.TryGetValue("hoge", out string value))
{
// Keyがなかったときは、default値だとnullや0になるので初期値を入れる
hoge = "hogehoge";
}
// Keyがあったときは返ってきたvalueを使う
hoge = value;
毎回if文書くのは正直めんどくさいですね。
そのめんどくささを以下の拡張メソッドで解消できます。
public static class DictionaryExtensions
{
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> dictionary,
TKey key,
TValue defaultValue = default(TValue))
{
if (dictionary.TryGetValue(key, out TValue value))
{
return value;
}
return defaultValue;
}
}
これを用意しておくだけで以下のように1行で書けるようになりました。
var value = DictionaryExtensions.GetValueOrDefault(dictionary, "hoge", "hogehoge");
これ便利なのでいつか使いたいです。
まとめ
TryGetValue
はKeyの存在チェックをするついでに値まで取得できちゃう便利なやつでした!
以上、Dictionary
のTryGetValue
についてでした!
と思った方はコメントいただけると嬉しいです。
最後までお読みいただきありがとうございました!
私が働く会社では、一緒に働いてくれるエンジニアを募集しています♪
- 未経験、第二新卒歓迎
- 学歴・転職回数・離職期間不問
- 残業は月15時間以下で残業代は全額支給
- 経験者は月給23万円以上
- 年収100万以上UP↑↑↑も可能
- 長く働いていても年収が全然上がらないから、一気に年収を上げたい
- 残業をしたくてしているわけではないので、残業代はしっかりと出して欲しい
- やりたいことに挑戦させてもらえないから、自分がしてみたいことに挑戦したい
- 通勤時間が長すぎるから、できるだけ短くしたい
- もっと勉強したいから、書籍代など負担してくれるところに入りたい
- 現場に駆り出されてからは放置プレイで、相談できる人も先輩も居ないので、自分の状況をちゃんと理解してくれるところで働きたい
上記内容に1つでも当てはまる場合は、ぜひご検討ください。