C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

KeyValuePairの空判定

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■86410 / inTopicNo.1)  KeyValuePairの空判定
  
□投稿者/ PPA (1回)-(2018/01/26(Fri) 16:08:01)

分類:[VB.NET/VB2005 以降] 

2018/01/26(Fri) 16:43:22 編集(投稿者)

(タイトルを修正しました。)

VB2012を使用しています。

例えば、Dictionary内のキーと値のペア(KeyValuePair)を
LinqのFirstOrDefaultのような方法で取得する際、
取得結果が空であるかどうかを判定するにはどうすればいいのでしょうか?
クラスであればNothingで判定できるのですが、
KeyValuePairはクラスじゃないから、Nothingが使えないのでしょうか?
また、KeyValuePairにEmpty的な値はあるのでしょうか?

C#だと、以下のようなサイトが見つかりましたが、
C#のコードに記載されているdefaultというものがVB.netで使えるのかどうか分かりません。

https://qiita.com/rohinomiya/items/4a3a72b7197e6fdb93df
http://www.remember-the-time.xyz/2016/03/c-sharp-if-key-value-pair-is-null.html
引用返信 編集キー/
■86415 / inTopicNo.2)  Re[1]: KeyValuePairの空判定
□投稿者/ Hongliang (607回)-(2018/01/26(Fri) 16:56:40)
> KeyValuePairはクラスじゃないから、Nothingが使えないのでしょうか?
基本的には、Yesです。

> また、KeyValuePairにEmpty的な値はあるのでしょうか?
ありません。

> C#だと、以下のようなサイトが見つかりましたが、
> C#のコードに記載されているdefaultというものがVB.netで使えるのかどうか分かりません。
C#のdefault(T)はVBではNothingで代用できたかと思います。
が、それが本当に「存在していないかどうか」とは別問題です。
例えば(Of Integer, Integer)の辞書に対してFirstOrDefaultを呼び出すと、
条件に一致するのが存在しない場合、
KeyおよびValueがIntegerの既定値である0を持ったKeyValuePair(Of Integer, Integer)
を返します。
これは、辞書に Key=0, Value=0 の要素が登録されている場合と区別できません。
// 決してkeyに0が登録されることはないとか、valueが0はあり得ないなどの前提条件があれば別ですが。
なので、そのリンク先の判定は不完全です。
引用返信 編集キー/
■86417 / inTopicNo.3)  Re[2]: KeyValuePairの空判定
□投稿者/ PPA (2回)-(2018/01/26(Fri) 17:33:23)
Hongliang さん、回答ありがとうございます。
KeyValuePairにEmpty的なものはないのですね。

ということは、逆に言えば、
DictionaryのKeyに「Keyの型の規定値を使用しない」という前提であれば、
FirstOrDefaultで得られたKeyValuePairのKey値で判断してもよい、
という理解で合っていますか?
※Keyの型がIntegerなら、Key = 0で判定
 (実データのKeyに0を使用しないことが前提)
 Keyの型がStringなら、Key Is Nothingで判定
 (そもそもKeyにNothingは設定できない?)

実際には、DictionaryのKeyにはStringを使用しているため、
Key Is Nothingを試してみた所、うまくいったように見えたのですが、
実は落とし穴がある、とか。
引用返信 編集キー/
■86419 / inTopicNo.4)  Re[1]: KeyValuePairの空判定
□投稿者/ 魔界の仮面弁士 (1554回)-(2018/01/26(Fri) 17:53:35)
No86410 (PPA さん) に返信
> クラスであればNothingで判定できるのですが、

下記の場合、a b いずれも、FirstOrDefault が Nothing を返しますよ?

Dim a As String() = {}
Dim b As String() = { Nothing }



> KeyValuePairはクラスじゃないから、Nothingが使えないのでしょうか?
VB における Nothing とは、「その型にとっての既定値」です。(C# の default に相当)

KeyValuePair に対しても Nothing を「代入」できます。

Dim kv As KeyValuePair(Of Date, Boolean) = Nothing

上記の場合、kv.Key は CDate(Nothing) すなわち #1/1/0001# となり、
kv.Value は CBool(Nothing) すなわち False となります。

「If kv Is Nothing」で判定したいという意味であれば、
null 許容型を使うことができます。

Dim kv As KeyValuePair(Of Date, Boolean)? = Nothing



> 例えば、Dictionary内のキーと値のペア(KeyValuePair)を
> LinqのFirstOrDefaultのような方法で取得する際、
> 取得結果が空であるかどうかを判定するにはどうすればいいのでしょうか?

案1: .DefaultIfEmpty(何某).FirstOrDefult(何某)
案2: .Cast(Of Nullable(Of K, V))().FirstOrDefult(何某)
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ