Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Removing elements from binding list

In one of my projects I'm trying to remove an item from a list where the id is equal to the given id.

I have a BindingList<T> called UserList.

Lists have all the method RemoveAll().

Since I have a BindingList<T>, I use it like that:

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

However, my list contains the same number of items as before.
Why it's not working?

like image 849
Rafay Zia Mir Avatar asked Feb 08 '12 14:02

Rafay Zia Mir


2 Answers

It's not working because you are working on a copy of the list which you created by calling ToList().

BindingList<T> doesn't support RemoveAll(): it's a List<T> feature only, so:

IReadOnlyList<User> usersToRemove = UserList.Where(x => (x.id == ID)).
                                             ToList();

foreach (User user in usersToRemove)
{
    UserList.Remove(user);
}

We're calling ToList() here because otherwise we'll enumerate a collection while modifying it.

like image 75
vc 74 Avatar answered Nov 01 '22 00:11

vc 74


You could try:

UserList = UserList.Where(x => x.id == ID).ToList(); 

If you use RemoveAll() inside a generic class that you intend to be used to hold a collection of any type object, like this:

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.

like image 2
Pranay Rana Avatar answered Oct 31 '22 23:10

Pranay Rana