Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@ayumu_walking

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

仕事で思いついた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の条件の設定にも利用
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?