2010-07-20 18 views
7

Tengo un objeto User y es la clase siguiente:LINQ Contiene método para un objeto

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

Y tengo una IEnumerable<User>

Quiero averiguar si existe un usuario específico en IEnumerable<User>, comparando al usuario por su ID.

Un ejemplo:

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 

¿Cómo puedo hacerlo? ¿Y cuál es la forma más rápida de recuperar este booleano, es Contiene?

Respuesta

12

Debe marcar User, no int. Enumerable.Any funcionan bien para esto:

// 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) y luego prueba para check.Count() == 1
  2. var check = list.FirstOrDefault(lu => lu.ID == users[0].ID) y luego prueba para check != null.
  3. list.Any(user => user.ID == users[1].ID);
4

Si se quiere evitar la expresión lambda, y piensa que puede necesitar para comparar User objetos por ID en otras partes de su código, que no escribe un comparador de la siguiente manera.

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. 
    } 
} 

Luego su consulta de lista se parece a la siguiente.

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

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

Para responder a su pregunta relacionada con la velocidad de recuperación, Contains es la manera más rápida si usted no sabe cómo las User objetos se ordenan en su colección. Si se ordenaron por ID y se almacenaron en un objeto List<User>, puede usar el método List<User>.BinarySearch() con una implementación adecuada de IComparer<User>.