Выражение Lambda в условии выражения if
Я новичок в С#, но из моего понимания этот код должен работать. Почему это не работает?
Это пример моего кода.
List<Car> cars // This has many cars initialized in it already
if (() => {
foreach(Car car in cars){
if (car.door == null) return true;
}
}){then .......}
Проще говоря, все, что я хочу сделать, это запустить оператор if
, если у какого-либо автомобиля нет двери.
После попытки компиляции я получаю эту ошибку:
Невозможно преобразовать лямбда-выражение для ввода 'bool', потому что это не тип делегата.
Ответы
Ответ 1
Если вы хотите проверить, нет ли у какого-либо автомобиля двери, просто используйте Enumerable.Any
- он определяет, удовлетворяет ли любой элемент последовательности условие:
if (cars.Any(c => c.door == null))
// then ...
Просто для удовольствия: вы должны выполнить lambda, чтобы получить логический результат в условии if (но для этого случая используйте Any)
Func<bool> anyCarDoesNotHaveDoor = () => {
foreach(var car in cars)
if (car.door == null)
return true;
return false;
};
if (anyCarDoesNotHaveDoor())
// then ...
Я представил локальную переменную, чтобы сделать вещи более ясными. Но, конечно, вы можете сделать эту головоломку более сложной.
if (new Func<bool>(() => {
foreach(var car in cars)
if (car.door == null)
return true;
return false; })())
// then ...
Ответ 2
Ну, ошибка говорит все. Оператор if
ожидает булевское выражение, которое не является делегатом. Если вы должны были вызвать делегата (при условии, что он вернул bool
), все будет в порядке. Однако if
не знает, как это назвать.
Простой способ сделать это с помощью метода расширения Any
LINQ:
if (cars.Any(car => car.door == null))
Метод Any
знает, что он действительно вызывает выражение лямбда для каждого члена коллекции и возвращает bool
. Это делает его допустимым булевым выражением для оператора if
.
Ответ 3
Если вы хотите на самом деле сделать что-то для автомобилей без дверей:
foreach (var car in cars.Where(car => car.door == null)) {
car.door = <whatever>;
}