2012-02-08 15 views
6

En uno de mis proyectos estoy tratando de eliminar un elemento de una lista donde el ID es igual al ID proporcionado. Tengo un BindingListEliminando elementos de la lista de encuadernación

UserList 

Como lista tiene un método

RemoveAll() 

Como IA tienen una BindingList lo que el uso de esa

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

Pero eso no funciona y mi lista contiene la misma cantidad de elementos que antes. ¿Por qué no está funcionando?

Respuesta

11

No funciona porque está trabajando en una copia de la lista que creó al llamar a ToList.

BindingList no soporta RemoveAll, es una característica de lista única, por lo que:

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

necesidad de llamar ToList de lo contrario vamos a enumerar una colección mientras que modificarlo.

+0

@rafay necesitamos t o llame a ToList; de lo contrario, enumeraremos una colección al modificarla, lo que generará una excepción. Esto se debe a la ejecución diferida de Where. Si trabaja en una copia, la lista original (UserList) no se actualizará cuando llame a RemoveAll. –

+0

gracias eso. –

2

Usted puede intentar

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

Esto podría ayudarle a

Si utiliza 'RemoveAll' dentro de una clase genérica que tiene la intención de ser usado para contener una colección de cualquier tipo de objeto, como este:

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

de hacer comentarios MSDN: http://msdn.microsoft.com/en-us/library/wdka673a.aspx en este

Cuestiones relacionadas