2010-07-20 3 views
7

J'ai un objet User et il est la classe suivante:Linq Contient méthode pour un objet

public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

et moi avons IEnumerable<User>

Je veux savoir si un utilisateur existe spécifique IEnumerable<User>, comparer l'utilisateur par son identifiant.

Un exemple:

IList<User> users = GetUsers();  // 1, 2, 3 
IEnumerable<User> list = GetList(); // 2, 5, 8 

// this doesn't work 
list.Contains(users[0].ID);   // false 
list.Contains(users[1].ID);   // true ! 
list.Contains(users[2].ID);   // false 

Comment puis-je faire? Et quel est le moyen le plus rapide pour récupérer ce booléen, est-ce Contient?

Répondre

12

Vous devez vérifier un User, pas un int. Enumerable.Any va bien travailler pour cela:

// this does work 
list.Any(user => user.ID == users[0].ID);   // false 
list.Any(user => user.ID == users[1].ID);   // true ! 
list.Any(user => user.ID == users[2].ID);   // false 
5
list.Any(u => u.ID == thing) 
0
  1. var check = list.Where(lu => lu.ID == users[0].ID) puis test pour check.Count() == 1
  2. var check = list.FirstOrDefault(lu => lu.ID == users[0].ID) puis test pour check != null.
  3. list.Any(user => user.ID == users[1].ID);
4

Si vous voulez éviter l'expression lambda et que vous pourriez avoir besoin de comparer User objets par ID dans d'autres parties de votre code, ne pas creer une comparateur comme suit.

class UserEqualityComparer : IEqualityComparer<User> 
{ 
    bool IEqualityComparer<User>.Equals(User lhs, User rhs) 
    { 
     return lhs.ID == rhs.ID; 
    } 

    int IEqualityComparer<User>.GetHashCode(User user) 
    { 
     return user.ID; // assumes all IDs are unique. 
    } 
} 

Ensuite, votre requête de liste ressemble à ce qui suit.

IEnumerable<User> list = GetList(); 
IEqualityComparer<User> userComparer = new UserEqualityComparer(); 

list.Contains(users[0], userComparer); 
list.Contains(users[1], userComparer); 
// etc... 

Pour répondre à votre question relative à la vitesse de récupération, Contains est la plus rapide si vous ne savez pas comment sont ordonnés les User objets de votre collection. Si elles ont été triées par ID et stockées dans un objet List<User>, vous pouvez utiliser la méthode List<User>.BinarySearch() avec une implémentation appropriée de IComparer<User>.