Как вернуть логическое значение из делегата действия в List.ForEach()

Я пытаюсь реализовать следующую вещь. Мне нужно вернуть true, если какая-либо кнопка будет изменена. Я не хочу больше зацикливаться.

Поскольку ForEach ищет делегата типа действия. Итак, возможно ли вернуть логическое значение из удаления

public bool AreSettingChanged()
{
    objRpmButtonHolder.RpmButtonCollection.ForEach(btn
        => {
            if (btn.IsChanged)
                return true;
    });
    return true;
}

person Shantanu Gupta    schedule 01.09.2010    source источник


Ответы (4)


Попробуй это

public bool AreSettingChanged() 
{ 
    return objRpmButtonHolder.RpmButtonCollection.Any(b => b.IsChanged);
} 
person Daniel Elliott    schedule 01.09.2010

Вы не можете, потому что так определен метод ForEach. В вашем случае лучше использовать метод расширения Any:

bool result = objRpmButtonHolder.RpmButtonCollection.Any(btn => btn.IsChanged);
person Darin Dimitrov    schedule 01.09.2010
comment
Хороший и простой ответ, никогда не думал, что у нас также есть любая функция. - person Shantanu Gupta; 01.09.2010
comment
Возврат из делегата не нарушит итерацию. - person Stephen Cleary; 01.09.2010
comment
@Стивен, это правильно. Я обновлю свой ответ. Спасибо за указание на это. - person Darin Dimitrov; 01.09.2010

Возможно, вы ищете другой метод, например Find или Exists.

person leppie    schedule 01.09.2010

Лучшим подходом было бы использование вышеупомянутого метода Any, но для более общего подхода с возвращаемыми переменными из лямбда-выражений вы можете захватить внешнюю переменную и использовать ее в качестве возвращаемого результата, т.е.:

        public bool AreSettingChanged()
        {
            bool changed = false;
            objRpmButtonHolder.RpmButtonCollection.ForEach(btn
                =>
                {
                    if (btn.IsChanged)
                        changed = true;
                });
            return changed;
        }
person Grozz    schedule 01.09.2010
comment
+1, хорошее универсальное решение. Хотя в этом случае я действительно считаю, что классический foreach более читаем, чем метод расширения ForEach. - person Heinzi; 01.09.2010
comment
Это решение не нарушает итерацию ForEach. - person Stephen Cleary; 01.09.2010
comment
Вообще не должно. Что касается этой конкретной проблемы, я уже упоминал, что лучше использовать классический foreach или любой из указанных выше методов расширения. - person Grozz; 01.09.2010