LINQ:文字列コレクションで複数キーワードのAND検索をするには?[C#、VB]

WhereメソッドをチェーンすればAND検索になる上半分に条件式をハードコーディングした先ほどのコードの結果、下半分にWhereメソッドをチェーンした結果が出ている。同じ結果が得られたことから、WhereメソッドをチェーンすればAND検索になると確認できた。さらに注目すべきは、文字列比較の実行順序だ。StringクラスのContainsメソッドの呼び出し順序が、全く同じになっている。最初のWhereメソッドを完全に実行してから2番目のWhereメソッドの実行に掛かるわけではないのだ。処理対象のコレクション(ここでは「sampleData」)の一つ一つに対して、最初のWhereメソッドのラムダ式(=「item.ContainsEx("ぶた")」)と2番目のWhereメソッドのラムダ式(=「ContainsEx("まつり")」)が連続して実行されている(かつ、ショートサーキットしている)。これはLINQの大きな特徴だ。Whereメソッドに限らず、IEnumerable<T>(VBでは「IEnumerable(of T)」、以降では省略)インターフェースのままチェーンすると、チェーン全体が1つのループに変換されて実行されるのである。

WhereメソッドをチェーンすればAND検索になる上半分に条件式をハードコーディングした先ほどのコードの結果、下半分にWhereメソッドをチェーンした結果が出ている。同じ結果が得られたことから、WhereメソッドをチェーンすればAND検索になると確認できた。さらに注目すべきは、文字列比較の実行順序だ。StringクラスのContainsメソッドの呼び出し順序が、全く同じになっている。最初のWhereメソッドを完全に実行してから2番目のWhereメソッドの実行に掛かるわけではないのだ。処理対象のコレクション(ここでは「sampleData」)の一つ一つに対して、最初のWhereメソッドのラムダ式(=「item.ContainsEx("ぶた")」)と2番目のWhereメソッドのラムダ式(=「ContainsEx("まつり")」)が連続して実行されている(かつ、ショートサーキットしている)。これはLINQの大きな特徴だ。Whereメソッドに限らず、IEnumerable<T>(VBでは「IEnumerable(of T)」、以降では省略)インターフェースのままチェーンすると、チェーン全体が1つのループに変換されて実行されるのである。