仕事で思いついたLINQ小ネタ集
チェックエラーのメッセージをDictionaryから取り出す
Dictionary(Of String, Boolean)とした、msgResult(errorMsg, result) の、
result = False のメッセージを取り出したいとき、
GetFalseMessage
Private Function GetFalseMessage(ByRef msgResult As Dictionary(Of String, Boolean)) As IEnumerable(Of String)
Return msgResult.Where(Function(d) Not d.Value).Select(Function(d) d.Key)
End Function
説明
- シンプルに。
Dictionary.Value
がBooleanであることを利用 - SQLなら
SELECT result From msgResult WHERE value = False
のイメージ
Pythonでいうall(list)がやりたい
IsAllTrue
Public Function IsAllTrue(ByRef boolList As List(Of Boolean)) As Boolean
Return boolList.All(Function(bl As Boolean) bl)
End Function
説明
- LINQにもAllがあるので利用。ただし、Pythonと違ってラムダ式が必要
- VB.Netでのラムダ式の書き方があまり好きではないです……
- Listの中身がBooleanなので、型の確認は不要なんですが、書き換えたときの副作用が怖いので
番外編: LINQの条件の先出しをする
Tは任意の型・クラスに置き換えてください
GetWhereCondition
Dim itemWhere As Func(Of T, Boolean) = (xを利用した条件)
Dim itemExist As New Predicate(T)(Function(x As T) (xを利用した条件))
説明
- フラグごとに処理を使い分けるものの、LINQでは共通の条件を複数個所に利用するときに有効
- 特に、LINQの条件が複雑だったり、長くなってしまった場合に切り分けると良いです
- Existsに使う時の引数の型が違うことに気づけず詰みかけました
- この考え方は、例えば文字列の
Regex.Match(value).Success
の条件の設定にも利用