2010-02-17 9 views

Antwort

60

Sie können Ihre gesonderte Bedingungen in ein einziges Prädikat rollen, wenn Sie mögen:

codebase.Methods.Where(x => (x.Body.Scopes.Count > 5) && (x.Foo == "test")); 

Oder Sie können einen separaten verwenden Where Für jede Bedingung anrufen:

codebase.Methods.Where(x => x.Body.Scopes.Count > 5) 
       .Where(x => x.Foo == "test"); 
+1

Betrachtet man große Klauseln mit vielen Informationen, haben beide Fälle die gleiche Komplexität oder ist die erste langsamer? – dwbrito

+3

@alaxid: Ich würde erwarten, dass die zweite * etwas * langsamer ist, weil jeder 'Where'-Aufruf einen kleinen zusätzlichen Aufwand verursacht (Methodenaufruf, Delegatenaufruf usw.). Ich würde mir darüber in normalen Alltagsszenarien keine Sorgen machen. – LukeH

+0

Ich suchte nach .Any(), anscheinend hat das funktioniert. Vielen Dank ! –

0

wie dieses ..

codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.Scopes.Count < 10); 
1

Was würde "y" darstellen?

Sie können einfach einen Standard & & Zustand verwenden. Keine Notwendigkeit für ein "y":

codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.SomethingElse < 14); 
2

In Ihrem Beispiel, wo kommt y her? Die Methode Where verwendet ein Lambda mit einem einzelnen Eingabeparameter, der eine einzelne Instanz der Sequenz darstellt, gegen die Sie arbeiten.

Sie können, natürlich, haben mehrere Bedingungen gegen x:

Where(x => x.Foo > 5 && x.Bar < 3) 
1

Ich verstehe es nicht. Was kannst du nicht tun? kein

codebase.Methods.Where(x => x.Head.IsHairy && x.Body != null && x.Body.Scopes.Count > 5); 
+0

Das y, das Sie mystifiziert, ist nur eine Art von Stand-in für das Objekt, gegen das im Filter getestet werden soll. Es kann ein "anonymer Delegierter" genannt werden, aber ich bin nicht sicher. In jedem Fall wird nur eine Variable bereitgestellt, die Sie verwenden können, um auf die Eigenschaften Ihres Typs im Lambda-Ausdruck zuzugreifen. Sie können jeden beliebigen Variablennamen verwenden. –

5

Sie können nicht zwei Delegierte in derselben definieren, wo aber Sie können hintereinander oder beide wie diese auf der gleichen Bedingung bauen setzen

var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.Scopes.name == ""); 

or 

var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5) 
     .where(y=> y.Body.Scopes.name == ''); 

or 

var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5 ) 
.Union(codebase.Methods.Where(y => y.Body.Scopes.name == '' )); 
0
codebase.Methods.Where(x => x.Body.Scopes.Count > 5).Where(x => x.Body.Scopes.TypeName == "Scopes").Where(x => x.Body.Scopes.Level == LEVEL_HIGH); 
Verwandte Themen