列表(T)RemoveAll()无法正常工作......?

时间:2010-12-09 17:06:43

标签: c# asp.net webforms

假设我有一个User对象列表,其中包含两个属性... ID和Name

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。&gt;

6 个答案:

答案 0 :(得分:6)

List.RemoveAll method

该方法从您调用它的列表中删除所有匹配的实例。这会修改现有列表,而不是返回新列表。

返回值是删除的行数。

答案 1 :(得分:5)

RemoveAll()返回删除的元素数。 你需要这样做:

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

答案 2 :(得分:3)

docs非常清楚发生了什么:

  

返回值   键入:System.Int32   从List中删除的元素数量。

也许以下的Linq会更符合您的期望?

lst.Except(t => IsExisting(t.ID)).ToList();

答案 3 :(得分:2)

您可以尝试使用IEnumerable的过滤器,而不是RemoveAll(),您可以这样说:

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

这使得代码更容易阅读并专注于手头任务的目标,而不是如何实现它。

答案 4 :(得分:1)

List<T>.RemoveAll(...)的返回类型为int,不是IListSourceIEnumerable也不是IDataSource

答案 5 :(得分:1)

RemoveAll正在修改列表并返回删除的项目数。您只需在第二步中将数据源设置为列表。

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