在我的一个项目中,我正在尝试从列表中删除id等于给定id的项目。
我有BindingList<T>
名为UserList
。
列表包含所有方法RemoveAll()
。
由于我有一个BindingList<T>
,我就这样使用它:
UserList.ToList().RemoveAll(x => x.id == ID )
但是,我的列表包含与以前相同数量的项目 为什么它不起作用?
答案 0 :(得分:16)
它无效,因为您正在处理通过调用ToList()
创建的列表副本。
BindingList<T>
不支持RemoveAll()
:它只是List<T>
功能,所以:
IReadOnlyList<User> usersToRemove = UserList.Where(x => (x.id == ID)).
ToList();
foreach (User user in usersToRemove)
{
UserList.Remove(user);
}
我们在这里调用ToList()
因为否则我们会在修改它时枚举一个集合。
答案 1 :(得分:2)
你可以尝试:
UserList = UserList.Where(x => x.id == ID).ToList();
如果你在一个通用类中使用RemoveAll()
,你打算用它来保存任何类型对象的集合,如下所示:
public class SomeClass<T>
{
internal List<T> InternalList;
public SomeClass() { InternalList = new List<T>(); }
public void RemoveAll(T theValue)
{
// this will work
InternalList.RemoveAll(x =< x.Equals(theValue));
// the usual form of Lambda Predicate
//for RemoveAll will not compile
// error: Cannot apply operator '==' to operands of Type 'T' and 'T'
// InternalList.RemoveAll(x =&gt; x == theValue);
}
}
此内容取自here。
答案 2 :(得分:0)
如果绑定列表中只有一个项目作为唯一ID,则下面的简单代码可以使用。
UserList.Remove(UserList.Where(x=>x.id==ID).First());