2012-02-08 4 views
6

В одном из моих проектов я пытаюсь удалить элемент из списка, где id равен заданному идентификатору. У меня есть BindingListУдаление элементов из списка привязки

UserList 

В список имеет метод

RemoveAll() 

Как Анджелес есть BindingList так я использую как этот

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

Но это не работает, и мой список содержит такое же количество элементов, как раньше. Почему он не работает?

ответ

11

Это не работает, потому что вы работаете над копией списка, созданного вами, вызывая ToList.

BindingList не поддерживает RemoveAll, это функция списка только так:

var itemToRemove = UserList.Where(x => x.id == ID).ToList(); 
foreach (var item in itemToRemove) 
{ 
    UserList.Remove(item); 
} 

нужно вызвать ToList иначе мы будем перечислять коллекцию, модифицируя его.

+0

@rafay Нам нужна т o вызывать ToList, иначе мы будем перечислять коллекцию при ее изменении, что приведет к возникновению исключения. Это связано с отложенным исполнением Where. Если вы работаете над копией, исходный список (UserList) не будет обновляться при вызове RemoveAll. –

+0

спасибо, что. –

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); 
} 
} 

из MSDN комментарий: http://msdn.microsoft.com/en-us/library/wdka673a.aspx на этом

Смежные вопросы