Операции C# bool для обнаружения любого ложного возврата

Я хотел бы написать что-то вроде следующего...

bool hasAnyInvalid = false;
hasAnyInvalid |= IsValidType1(...);
hasAnyInvalid |= IsValidType2(...);
hasAnyInvalid |= IsValidType3(...);
hasAnyInvalid |= IsValidType4(...);

if (hasAnyInvalid){ return false; }

Насколько я могу судить, вышесказанное не удастся, потому что истина | истина ложь

Как я могу использовать одну логическую переменную для проверки нескольких функций на ложность?

Мне нужно оценить каждую из функций IsValidType. Поэтому я не могу замкнуть его.

По сути, я хочу логические врата, которые, как только они сбываются, остаются верными. Кажется, я вспоминал, как делал это раньше в C++ с возвратами HRESULT, но, возможно, мы просто складывали целочисленное значение серьезности.

Я открыт для других способов решения этого.

РЕДАКТИРОВАТЬ: я плохо сформулировал этот вопрос, и включил несколько логических snafus (я хотел написать это как XOR). Я собираюсь оставить свой оригинальный вопрос выше, потому что люди специально прокомментировали это, и я ненавижу изменять историю.

4 ответа

Решение

Если вы хотите обнаружить один false, вам нужно использовать &не |:

bool allValid = true; // Start it with "true"
allValid &= IsValidType1(...); // The first "false" will make "allValid" false
allValid &= IsValidType2(...);
allValid &= IsValidType3(...);
allValid &= IsValidType4(...);
if (!allValid) { // Invert "allValid" before returning
    return false;
}

Это не приведет к короткому замыканию оценки функций по их значениям и вернет true если любая из функций возвращает false.

bool[] results = new[] {
    IsValidType1(),
    IsValidType2(),
    IsValidType3(),
    IsValidType4() 
};
return results.Any(b => !b);

Обратите внимание, что это выглядит как ваше требование: возврат true если какой-либо из результатов false,

Мне нужно оценить каждую из функций IsValidType. Поэтому я не могу замкнуть его.

Это должно означать, что у функций есть побочные эффекты, которые вы должны наблюдать. Просто убедитесь, что вы документируете свой код, чтобы никто не видел его и не осознавал, что изменение его на короткое замыкание при оценке функции может привести к ошибкам путем устранения побочных эффектов.

Насколько я могу судить, вышесказанное не удастся, потому что true | true является false,

Я не уверен, что заставляет тебя так думать. true | true, то есть true or true является true, Вы можете думать о xor, но это было бы true ^ true,

Проблема с вашим кодом в том, что ваша переменная помечает недействительность, а функция проверяет правильность. Вы можете изменить возвращаемое значение каждого IsValid позвоните, чтобы ответить на вопрос IsInvalid, Просто добавьте ! перед каждым IsValid вызов. Код будет выглядеть так:

bool hasAnyInvalid = false;
hasAnyInvalid |= !IsValidType1(...);
hasAnyInvalid |= !IsValidType2(...);
hasAnyInvalid |= !IsValidType3(...);
hasAnyInvalid |= !IsValidType4(...);

return hasAnyInvalid;

Нет необходимости в переменной, вы можете просто написать следующее:

private bool IsValidForAllTypes(...)
{
   return IsValidType1(...) & IsValidType2(...) & IsValidType3(...) & IsValidType4(...);
}
Другие вопросы по тегам