从绑定列表中删除元素

10
在我的一个项目中,我正在尝试从一个列表中删除id等于给定id的项目。
我有一个名为UserListBindingList<T>
列表具有所有方法RemoveAll()
由于我有一个BindingList<T>,所以我这样使用它:
UserList.ToList().RemoveAll(x => x.id == ID )

然而,我的列表中包含与之前相同数量的项目。
为什么它不起作用?
3个回答

18

它不起作用的原因是您正在处理通过调用 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(),因为如果不这样做,我们将在修改集合时枚举它。

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 =&amp;gt; x == theValue);
    }
}

This content is taken from here.


0
如果在BindingList中只有一个唯一ID项,那么下面的简单代码可以工作。
UserList.Remove(UserList.First(x=>x.id==ID));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接