2010-12-09 4 views
2

Disons que j'ai une liste d'objets de l'utilisateur avec deux propriétés ... ID et NomListe (T) RemoveAll() ne fonctionne pas comme prévu ...?

List<User> lst = List<User>(); 

Je remplirai avec un groupe d'utilisateurs. Ok, maintenant je veux couper ma liste en utilisant RemoveAll() et cette fonction.

private Boolean IsExisting(int id) { 
//blah blah 
return true; 
//blah blah 
return false; 
} 

J'utiliser cette déclaration:

gdvFoo.DataSource = lst.RemoveAll(t => IsExisting(t.ID)); 

Je crois comprendre que chaque fois que IsExisting retourne vrai que cet élément devrait être retiré de LST, mais ce qui se passe, assez étrangement, est-il renvoie un nombre entier? , pas une liste tronquée et j'ai reçu le message d'erreur suivantes:

La source de données est un type non valide. Il doit être soit un IListSource, IEnumerable ou IDataSource>

+0

Vous pouvez essayer de lire la documentation de RemoveAll http://msdn.microsoft.com/en-us/library/wdka673a.aspx qui explique clairement ce qu'il renvoie et contient des exemples d'utilisation. –

+0

J'ai noté et lu la documentation deux fois.C'est pourquoi j'ai demandé ici, parce que je ne pouvais pas comprendre comment le mien différait de leur exemple ... mais je suppose que c'est ce que je fais pour essayer d'être trop intelligent et de trop prendre trop d'une ligne. – bulltorious

Répondre

5

RemoveAll() retourne le nombre d'éléments supprimés. Vous devez faire ceci:

lst.RemoveAll(t => IsExisting(t.ID)); 
gdvFoo.DataSource = lst; 
3

Les docs sont très clairs sur ce qui se passe.

Valeur de retour Type: System.Int32 Le nombre d'éléments retirés la liste .

Peut-être que le Linq suivant serait plus conforme à vos attentes?

lst.Except(t => IsExisting(t.ID)).ToList(); 
6

List.RemoveAll method

La méthode supprime toutes les instances de correspondance de la liste sur laquelle vous l'avez appelé. Cela modifie la liste existante plutôt que d'en renvoyer une nouvelle.

La valeur de retour est le nombre de lignes supprimées.

1

List<T>.RemoveAll(...) a un type de retour de int qui ne constitue pas une IListSource, ni IEnumerableIDataSource

1

Le RemoveAll modifie la liste et renvoyer le nombre d'éléments supprimés. Vous venez de définir votre source de données à la liste dans une deuxième étape.

lst.RemoveAll(t => IsExisting(t.ID)); 
gdvFoo.DataSource = lst; 
2

Au lieu de RemoveAll(), vous pouvez essayer d'utiliser le filtre de IEnumerable où vous dire quelque chose comme:

var filteredList = lst.Where(item => IsExisting(item.Id)) 

Cela rend le code un peu plus facile à lire et se concentre sur l'objectif de la tâche à accomplir, plutôt que de voir comment l'appliquer.

Questions connexes