Лямбда-выражение не работает в списке объектов

У меня есть список объектов, и я могу добавить запись с этим предложением:

List<DragerClass.Alarm> alarms = new List<DragerClass.Alarm>();
public void createAlarm(int i, int[] alarms)
{
    alarms.Add(new DragerClass.Alarm(i, DateTime.Now, DragerClass.Dedector.Dedector_Name[i] + " UNDER RANGE"))`;
}

Но когда я пытаюсь удалить элемент, он ведет себя так, как будто лямбда-выражение не поддерживает:

public void removeAlarm(int i)
{
    alarms.Remove(x => x.Dedector_No == i);
}

Я вижу это сообщение, когда стою на коде

невозможно преобразовать лямбда-выражение в тип «Drager_GasDedection.DragerClass.Alarm», поскольку это не тип делегата

Я использую Visual Studio 2010, а также добавил System.Data.Entity в ссылки. Но все же. Спасибо за любую помощь.


person CanESER    schedule 10.06.2016    source источник
comment
@ASh Я попробовал это с помощью RemoveAll сейчас, и теперь сообщение: «Drager_GasDedection.DragerClass.Alarm» не содержит определения для «Dedector_No» и нет метода расширения «Dedector_No», принимающего первый аргумент типа «Drager_GasDedection.DragerClass.Alarm». может быть найден (вам не хватает использования...)   -  person CanESER    schedule 10.06.2016
comment
Я думаю, вам нужно alarms.RemoveAt(i);   -  person Mike Debela    schedule 10.06.2016
comment
я - это номер элемента, а не индекс списка, поэтому RemoveAt бесполезен @MikeDebela   -  person CanESER    schedule 10.06.2016
comment
Что вы имеете в виду под номером элемента?   -  person Mike Debela    schedule 10.06.2016
comment
@CanESER, я думаю, вы должны объяснить, что вы удаляете (тревоги или детекторы), и описать свои структуры данных. но использование Remove с предикатом неверно   -  person ASh    schedule 10.06.2016
comment
@ASh, когда я обнаруживаю проблему в детекторе, я помещаю их в список объектов в коде и показываю последние на главной странице, затем, если все в порядке, мне нужно удалить этот детектор из этого списка, и я использую номер детектора для удалите его, переменная i - это номер детектора. и по этому номеру детектора мне нужно найти добавленный объект в списке и удалить. может быть, моя проблема такая, как вы сказали, я использую ее неправильно, можете ли вы помочь с этим, пожалуйста   -  person CanESER    schedule 10.06.2016
comment
@MikeDebela на самом деле я так использую, я неправильно поставил здесь сингл '='   -  person CanESER    schedule 10.06.2016
comment
@CanESER Не Remove, это RemoveAll. Remove ожидает Alarm объект.   -  person Mike Debela    schedule 10.06.2016


Ответы (1)


Взгляните на методы List<T>. Метод Remove(T) просто ожидает один элемент. Если он найден в списке, он удаляется, в противном случае ничего не делается. Remove не ищет Predicate<T> для проверки.

Однако RemoveAll(Predicate<T>) ожидает предикат. Итак, вам нужно позвонить:

alarms.RemoveAll(x => x.Dedector_No == i);

Вы также должны изменить = на == в своем коде, так как в противном случае вы выполняете присваивание вместо проверки на равенство. Кроме того, обратите внимание, что этот метод удалит все тревоги с данным номером датчика, а не только первый.

person Willem Van Onsem    schedule 10.06.2016
comment
В этом списке каждый датчик может иметь максимум один сигнал тревоги, поэтому удалить все не проблема, и извините за '=', на самом деле это было то, что я хотел напечатать, сейчас исправляю. - person CanESER; 10.06.2016