2010-12-09 156 views
2

比方说,我有用户对象的名单有两个属性:ID和名称列表(T)RemoveAll()不按预期工作......?

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>

+0

您可以尝试阅读RemoveAll http://msdn.microsoft.com/en-us/library/wdka673a.aspx的文档,该文档清楚地说明了它返回的内容并提供了如何使用它的示例。 – 2010-12-09 17:11:17

回答

5

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

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

docs约很清楚这是怎么回事:

返回值 类型:System.Int32 从中移除元素的数量列表 。

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

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

List.RemoveAll method

的方法去除上,您把它叫做列表中的所有匹配的情况。这修改了现有的列表,而不是返回一个新的列表。

返回值是被删除的行数。

1

List<T>.RemoveAll(...)具有int返回类型而这并不是IListSourceIEnumerable也不IDataSource

1

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

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

相反的removeAll(),你可以尝试使用的IEnumerable的过滤器,你会这样说的:

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

这使得代码更容易阅读和论点集中上的目标目前的任务,而不是如何看待实施它。