List (T) RemoveAll () не работает должным образом ...? - PullRequest
2 голосов
/ 09 декабря 2010

Допустим, у меня есть список объектов User с двумя свойствами ... ID и Имя

List<User> lst = List<User>();

Я заполнил его группой пользователей.Хорошо, теперь я хочу урезать свой список, используя RemoveAll () и эту функцию.

private Boolean IsExisting(int id) {
//blah blah
return true;
//blah blah
return false;
}

Поэтому я использую этот оператор:

gdvFoo.DataSource = lst.RemoveAll(t => IsExisting(t.ID));

Насколько я понимаю, всякий раз, когда IsExisting возвращает trueэтот элемент должен быть удален из lst, но что происходит, как ни странно, он возвращает целое число, а не усеченный список, и я получил следующее сообщение об ошибке:

Источник данных недопустимого типа.Это должен быть либо IListSource, IEnumerable, либо IDataSource.>

Ответы [ 6 ]

6 голосов
/ 09 декабря 2010

List.RemoveAll метод

Метод удаляет все совпадающие экземпляры из списка, в котором вы их вызвали. Это изменяет существующий список, а не возвращает новый.

Возвращаемое значение - количество удаленных строк.

5 голосов
/ 09 декабря 2010

RemoveAll () возвращает количество удаленных элементов. Вам нужно сделать это:

lst.RemoveAll(t => IsExisting(t.ID)); 
gdvFoo.DataSource = lst;
3 голосов
/ 09 декабря 2010

Документы очень четко понимают, что происходит:

Возвращаемое значение Тип: System.Int32 Количество элементов, удаленных из списка.

Возможно, следующий Linq будет более соответствовать вашим ожиданиям?

lst.Except(t => IsExisting(t.ID)).ToList();
2 голосов
/ 09 декабря 2010

Вместо RemoveAll () вы можете попробовать использовать фильтр IEnumerable, где вы скажете что-то вроде:

var filteredList = lst.Where(item => IsExisting(item.Id)) 

Это делает код немного легче для чтения и фокусируется на цели задачи встороны, а не как смотреть на его реализацию.

1 голос
/ 09 декабря 2010

RemoveAll изменяет список и возвращает количество удаленных элементов.Вы просто устанавливаете свой источник данных в список на втором этапе.

lst.RemoveAll(t => IsExisting(t.ID));
gdvFoo.DataSource = lst;
1 голос
/ 09 декабря 2010

List<T>.RemoveAll(...) имеет тип возврата int, который не является IListSource, IEnumerable или IDataSource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...