从绑定列表中删除元素

时间:2012-02-08 14:56:19

标签: c# wpf linq bindinglist

在我的一个项目中,我正在尝试从列表中删除id等于给定id的项目。

我有BindingList<T>名为UserList

列表包含所有方法RemoveAll()

由于我有一个BindingList<T>,我就这样使用它:

UserList.ToList().RemoveAll(x => x.id == ID )

但是,我的列表包含与以前相同数量的项目 为什么它不起作用?

3 个答案:

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

此内容取自here

答案 2 :(得分:0)

如果绑定列表中只有一个项目作为唯一ID,则下面的简单代码可以使用。

UserList.Remove(UserList.Where(x=>x.id==ID).First());