この記事では、C#の論理演算子を使用して2つの
オブジェクトを組み合わせる方法について説明します。 直接Expression<Func<bool>>
またはAND
を使用することは不可能です。代わりに、OR
、Expression.AndAlso
、およびOrElse
が採用されています。 式が異なるパラメーターを使用すると、複雑さが増加します。 3つのソリューションが提示されています:Not
2つのブール式を組み合わせた
課題は、論理と、または、またはそうでないかを使用して、2つのオブジェクトを組み合わせることにあります。
のような単純なアプローチは無効です。
Expression<Func<bool>>
expr1 AND expr2
solutions
これに対処するいくつかの方法:
メソッド1:
の使用
Invoke
このメソッドは、メソッドを使用して、共通のパラメーターコンテキスト内で各式を実行します。
Invoke
メソッド2:パラメーター置換(条件)
<code class="language-csharp">static Expression<Func<bool>> AndAlso<T>( this Expression<Func<bool>> left, Expression<Func<bool>> right) { var param = Expression.Parameter(typeof(T), "x"); var body = Expression.AndAlso( Expression.Invoke(left, param), Expression.Invoke(right, param) ); var lambda = Expression.Lambda<Func<bool>>(body, param); return lambda; }</code>このアプローチは、式が同じパラメーターを共有しているかどうかをチェックします。もしそうなら、よりシンプルな
が使用されます。それ以外の場合は、最初のパラメーターを使用して2番目の式を呼び出します。
メソッド3: AndAlso
<code class="language-csharp">static Expression<Func<bool>> AndAlso<T>( this Expression<Func<bool>> expr1, Expression<Func<bool>> expr2) { ParameterExpression param = expr1.Parameters[0]; if (ReferenceEquals(param, expr2.Parameters[0])) { return Expression.Lambda<Func<bool>>( Expression.AndAlso(expr1.Body, expr2.Body), param); } return Expression.Lambda<Func<bool>>( Expression.AndAlso( expr1.Body, Expression.Invoke(expr2, param)), param); }</code>。
メソッドの選択は、表現の複雑さと最適化されたパフォーマンスの必要性に依存します。 方法1は簡単で、方法2はパラメーターと一致するときにパフォーマンスの改善を提供し、方法3は異なるパラメーターを処理するための堅牢なソリューションを提供します。
以上が論理演算子を使用して2つの式オブジェクトを組み合わせる方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。