LoginSignup
0
0

More than 5 years have passed since last update.

仕事で思いついたLINQ小ネタ集

Posted at

仕事で思いついた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の条件の設定にも利用
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0