PredicateBuilder И или Или - PullRequest
       321

PredicateBuilder И или Или

3 голосов
/ 17 февраля 2012

Во всех примерах, которые я видел для построителя предикатов, он показывает начальное выражение с PredicateBuilder.True, если вы строите критерии выражения "и", и PredicateBuilder.False, если вы строите критерии выражения "или".

Мои вопросы: всегда ли так, и если да, то почему это нельзя сделать просто. Я подозреваю, что должны быть случаи, когда вы строите выражение «и» и хотите начать с false. И наоборот для "или"

Кто-нибудь может мне это объяснить?

1 Ответ

7 голосов
/ 15 августа 2012

В выражениях A и B и C и D, если любое из условий (A, B, C или D) является False, все выражение является False.Поэтому, если вы начинаете выражение «и» с False, независимо от того, что еще вы И с ним, все выражение будет False.

То же самое с выражением «или».В выражении A или B или C или D, если любое из условий (A, B, C или D) имеет значение True, все выражение имеет значение True.Таким образом, если вы начинаете выражение «или» с True, независимо от того, что еще вы ИЛИ для него, все выражение будет True.

Что касается того, почему вам нужно запустить PredicateBuilder с буквальным True или False,Я считаю, что это было просто соглашение, чтобы сделать использование PredicateBuilder проще.Ваши выражения всегда начинаются с (логического) условия, за которым следуют 0 или более частей «И / или условия».Таким образом, вы можете иметь «А», или «А и В», или «А и В и С».Вы никогда не начинаете с «и А»..And (условие) PredicateBuilder добавляет «и условие» к выражению, поэтому вы не можете начать с него.Возможно, был конструктор, который позволил бы вам создать свое выражение и запустить его с начальным условием (новое выражение <...> (A)? Я на самом деле не проверял ... есть ли такое?), Но тогда вы быприходится обрабатывать ваше первое условие (вы, вероятно, перебираете некоторую коллекцию вещей и добавляете к своему выражению) иначе (вызывая конструктор), чем вы выполняете 2-е и последующие условия (вызывая .And (...) или .Or (...)).Методы .True <...> () и .False <...> () PredicateBuilder обрабатывают создание вашего выражения, а также добавляют первое (универсальное) условие, чтобы вы могли обрабатывать добавление 1-го и всех последующих условий вваш цикл такой же (вызывая .And (...) или .Or (...)).

...