Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表(T)RemoveAll()未按预期工作。。。?_C#_Asp.net_Webforms - Fatal编程技术网

C# 列表(T)RemoveAll()未按预期工作。。。?

C# 列表(T)RemoveAll()未按预期工作。。。?,c#,asp.net,webforms,C#,Asp.net,Webforms,假设我有一个用户对象列表,它有两个属性:ID和Name List<User> lst = List<User>(); 所以我用这句话: gdvFoo.DataSource = lst.RemoveAll(t => IsExisting(t.ID)); 我的理解是,每当IsExisting返回true时,应该从lst中删除元素,但奇怪的是,它返回的是一个整数,而不是一个截断的列表,我收到了以下错误消息: 数据源是无效的类型。它必须是IListSource、IEnu

假设我有一个用户对象列表,它有两个属性:ID和Name

List<User> lst = List<User>();
所以我用这句话:

gdvFoo.DataSource = lst.RemoveAll(t => IsExisting(t.ID));
我的理解是,每当IsExisting返回true时,应该从lst中删除元素,但奇怪的是,它返回的是一个整数,而不是一个截断的列表,我收到了以下错误消息:

数据源是无效的类型。它必须是IListSource、IEnumerable或IDataSource。>

他们非常清楚发生了什么:

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

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

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

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

返回值是删除的行数。

列表。RemoveAll(…)
的返回类型为
int
,它不是
IListSource
IEnumerable
IDataSource

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

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

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

lst.RemoveAll(t => IsExisting(t.ID));
gdvFoo.DataSource = lst;
您可以尝试使用IEnumerable的过滤器,而不是RemoveAll(),在这里您可以说:

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

这使得代码更容易阅读,并将重点放在手头任务的目标上,而不是如何实现它

您可以尝试阅读RemoveAll的文档,其中清楚地解释了它返回的内容,并提供了如何使用它的示例。这就是为什么我在这里问这个问题,因为我不知道我的例子和他们的例子有什么不同……但我想这就是我试图太聪明,把太多的东西塞进一行的原因。
var filteredList = lst.Where(item => IsExisting(item.Id))