假设我有一个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;
答案 0 :(得分:6)
答案 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
,不是IListSource
,IEnumerable
也不是IDataSource
答案 5 :(得分:1)
RemoveAll正在修改列表并返回删除的项目数。您只需在第二步中将数据源设置为列表。
lst.RemoveAll(t => IsExisting(t.ID));
gdvFoo.DataSource = lst;