3

述語ビルダーについて私が見たすべての例ではPredicateBuilder.True、「and」式基準をPredicateBuilder.False構築している場合と「or」式基準を構築している場合の開始式を示しています。

私の質問は、これは常に当てはまるのか、もしそうなら、なぜこれを単純に推測できないのかということです。「and」式を作成していて、false から始めたい場合があると思います。そして「または」の反対

誰かが私にこれを説明できますか?

4

1 に答える 1

7

式 A と B および C と D では、条件 (A、B、C、または D) のいずれかが False の場合、式全体が False になります。したがって、「and」式を False で開始すると、他に何を AND として使用しても、式全体が False になります。

「または」式と同じです。式 A または B または C または D で、条件 (A、B、C、または D) のいずれかが True の場合、式全体が True になります。そのため、「or」式を True で開始すると、他に何を OR しても、式全体が True になります。

なぜ PredicateBuilder をリテラルの True または False で開始する必要があるのか​​というと、これは単純に PredicateBuilder を使いやすくするための慣習に過ぎないと思います。式は常に (ブール) 条件で始まり、その後に 0 個以上の「And/Or 条件」部分が続きます。したがって、「A」、「A と B」、または「A と B と C」を使用できます。「and A」から始めることはありません。PredicateBuilder の .And(condition) は、式に「and 条件」を追加するため、それから始めることはできません。Expression を作成し、それを初期条件 (new Expression<...>(A)? 実際にはチェックしていません... ありますか?) で開始できるようにするコンストラクターがあった可能性がありますが、その後、あなたの最初の状態を治療する必要があります(あなたの おそらく、いくつかのコレクションをループして Expression に追加する) は、2 番目以降の条件 (.And(...) または .Or(...) を呼び出す) とは異なる方法 (コンストラクターを呼び出す) です。PredicateBuilder の .True<...>() および .False<...>() メソッドは、式の作成と最初の (汎用) 条件の追加を処理するため、最初の条件と後続のすべての条件の追加を処理できます。あなたのループは同じです(.And(...)または.Or(...)を呼び出すことによって)。

于 2012-08-14T20:12:12.873 に答える