Подтвердить что ты не робот

Выражение 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', потому что это не тип делегата.

4b9b3361

Ответ 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>;
}