2011-07-25 3 views
0

Je supprime les utilisateurs d'une collection d'utilisateurs en utilisant linq comme ci-dessous. Y a-t-il mieux de le faire? Puis-je fusionner la première et la seconde requête?Enregistrement dans la liste et Filtrer la collection à l'aide de Linq

List<int> userIDs = ConfigurationManager.AppSettings["users"].Split(',').Select(userId =>   Convert.ToInt32(userid)).ToList(); 

foreach (int userId in userIDs) 
{ 
    userInfoList.RemoveAll(user => (user.UserId.Equals(userId))); 
} 

UserInfoList est une collection d'utilisateurs.

Merci à l'avance

+0

Le 'userInfoList' sera-t-il déjà rempli avec des éléments et vous voulez le filtrer ou est-ce juste une étape que vous prenez en l'initialisant? Vous seriez en mesure de créer la liste en une fois avec une seule requête. UserInfoList sera renseigné. –

+0

J'ai utilisé la solution Petar Ivanov car j'aurai besoin de la liste originale pour d'autres cas. – San

Répondre

2

Ce serait plus efficace:

HashSet<int> userIDs = new HashSet<int>(ConfigurationManager.AppSettings["users"].Split(',').Select(userId => Convert.ToInt32(userId))); 

userInfoList.RemoveAll(user => userIDs.Contains(user.UserId)); 

Si vous avez n éléments dans les éléments et m de noms d'utilisateurs userInfoList, votre solution est O (n * m). En utilisant HashSet, la complexité devient O (n + m) - beaucoup mieux. (En supposant que les opérations de table de hachage sont à temps constant).

+0

En fait, vous pouvez utiliser 'contains' exactement parce que' user.UserId' est de type 'int' (puisque' userIds' est de type 'HashSet ') –

Questions connexes