2010-07-25 8 views
28

Ich muss nur klarstellen, dass die angegebene Sammlung ein Element enthält.IEnumerable <T>. Enthält mit Prädikat

Ich kann das über collection.Count(foo => foo.Bar == "Bar") > 0) tun, aber es wird die unnötige Arbeit tun - iterieren Sie die gesamte Sammlung, während ich auf das erste Auftreten stoppen muss.

Aber ich möchte versuchen, Contains() mit einem Prädikat, z. foo => foo.Bar == "Bar".

Derzeit IEnumerable<T>.Contains hat zwei Unterschriften:

  • IEnumerable<T>.Contains(T)

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

Also muss ich eine Variable angeben, um zu überprüfen:

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

oder schreibe meine benutzerdefinierte IEqualityComparer<Foo>, die gegen meine Sammlung verwendet wird:

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(); 
    } 
} 

es also noch andere Methoden Prädikat zu benutzen?

Antwort

58
.Any(predicate) 

klingt wie, was Sie wollen; gibt bool zurück und gibt true zurück, sobald eine Übereinstimmung gefunden wird, sonst false. Es gibt auch:

.All(predicate) 

, die in ähnlicher Weise verhält, Rückkehr false, sobald eine Nicht-Übereinstimmung gefunden wird, sonst true.

8

Sie können Any(predicate) verwenden. Es wird True oder False zurückgeben, abhängig davon, ob das Prädikat in einer bestimmten Sammlung existiert.

8

Schauen Sie sich die IEnumerable<T>.Any Erweiterung an.

Verwandte Themen