2012-02-08 10 views
6

In uno dei miei progetti sto cercando di rimuovere un elemento da un elenco in cui id è uguale a un determinato ID. Ho un BindingListRimozione di elementi dall'elenco di binding

UserList 

come una lista ha un metodo di

RemoveAll() 

Come IA hanno una BindingList così io uso come quella

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

Ma questo non funziona e la mia lista contiene stesso numero di articoli di prima. Perché non funziona?

risposta

11

Non funziona perché si sta lavorando su una copia della lista creata dall'utente chiamando ToList.

BindingList non supporta RemoveAll, è una caratteristica di elencare soltanto, in modo da:

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

necessario chiamare ToList altrimenti faremo enumerare una collezione durante la modifica di esso.

+0

@rafay Abbiamo bisogno di t o chiama ToList altrimenti enumereremo una raccolta durante la modifica che genererà un'eccezione. Ciò è dovuto all'esecuzione differita di Where. Se si lavora su una copia, l'elenco originale (UserList) non verrà aggiornato quando si chiama RemoveAll. –

+0

grazie. –

2

Si può provare

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

Questo potrebbe aiutare a

Se si utilizza 'RemoveAll' all'interno di una classe generica che si intende essere utilizzato per contenere una raccolta di qualsiasi tipo di oggetto, in questo modo:

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

da MSDN commento: http://msdn.microsoft.com/en-us/library/wdka673a.aspx su questo

Problemi correlati