C#

【C#】TryGetValueはKeyの存在チェックしたついでに値を取得

アイキャッチ(c_sharp)

こんにちは!
なかむぅです。

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"];
}

詳しくはこちらの記事に記載していますので、参考にしてください。

アイキャッチ(c_sharp)
【C#】ContainsKeyはKeyの存在チェックです【Dictionary】こんにちは! なかむぅです。 C#のコードを読んでいるとContainsKey(TKey key)というものがでてきて ...

default値をセットできる拡張メソッドを作る

記事を漁っていると、以下の記事に良さげな拡張メソッドが紹介されていたのでメモ書き。

TryGetValueを使ってKeyの存在チェックをしたとき、Keyが存在しない場合は型のdefault値が返ってくる。

その時、stringや参照型だとnullが返ってくるので、値を代入してあげる必要が出てくる場面もあると思います。
(Value値がintのときは0boolのときは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の存在チェックをするついでに値まで取得できちゃう便利なやつでした!

以上、DictionaryTryGetValueについてでした!

いやここは違うだろ

と思った方はコメントいただけると嬉しいです。

最後までお読みいただきありがとうございました!


我が社で一緒に働きませんか?

私が働く会社では、一緒に働いてくれるエンジニアを募集しています♪

我が社のココがアツイ!!
  • 未経験、第二新卒歓迎
  • 学歴・転職回数・離職期間不問
  • 残業は月15時間以下で残業代は全額支給
  • 経験者は月給23万円以上
  • 年収100万以上UP↑↑↑も可能
  • 長く働いていても年収が全然上がらないから、一気に年収を上げたい
  • 残業をしたくてしているわけではないので、残業代はしっかりと出して欲しい
  • やりたいことに挑戦させてもらえないから、自分がしてみたいことに挑戦したい
  • 通勤時間が長すぎるから、できるだけ短くしたい
  • もっと勉強したいから、書籍代など負担してくれるところに入りたい
  • 現場に駆り出されてからは放置プレイで、相談できる人も先輩も居ないので、自分の状況をちゃんと理解してくれるところで働きたい

上記内容に1つでも当てはまる場合は、ぜひご検討ください。

詳細ページ


COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です