2010-07-25 7 views
28

Solo necesito aclarar que la colección dada contiene un elemento.IEnumerable <T> .Contiene el predicado

que pueda hacer eso a través de collection.Count(foo => foo.Bar == "Bar") > 0) pero va a hacer el trabajo innecesario - iterar toda la colección, mientras que necesito parar en la primera aparición.

Pero quiero tratar de usar Contains() con un predicado, p. Ej. foo => foo.Bar == "Bar".

Actualmente IEnumerable<T>.Contains tiene dos firmas:

  • IEnumerable<T>.Contains(T)

  • IEnumerable<T>.Contains(T, IEqualityComparer<T>)

Así que tengo que especificar alguna variable para comprobar:

var collection = new List<Foo>() { foo, bar }; 
collection.Contains(foo); 

o escribir mi costumbre IEqualityComparer<Foo> que será utilizado en contra de mi colección:

class FooComparer : IEqualityComparer<Foo> 
{ 
    public bool Equals(Foo f1, Foo f2) 
    { 
     return (f1.Bar == f2.Bar); // my predicate 
    } 

    public int GetHashCode(Foo f) 
    { 
     return f.GetHashCode(); 
    } 
} 

Entonces ¿Hay otros métodos para utilizar el predicado?

Respuesta

58
.Any(predicate) 

suena como lo que quieres; devuelve bool, devolviendo true tan pronto como se encuentre una coincidencia, sino false. También hay:

.All(predicate) 

que se comporta de una manera similar, volviendo false tan pronto como no se encuentra una coincidencia, de lo contrario true.

8

Puede usar Any(predicate). Devolverá verdadero o falso dependiendo de si el predicado existe en una cierta colección.

8

Eche un vistazo a la extensión IEnumerable<T>.Any.

Cuestiones relacionadas