仕事で思いついた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の条件の設定にも利用
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.