2010-02-10 10 views
5

Hier sind zwei C# -Klassen ...Was macht diese LINQ-Abfrage?

public class Address 
{ 
    public string Country; 
    public string City; 
} 

public class Traveller 
{  
    public string Name; 
    public List<Address> TravelRoute; 
} 

... und eine Liste von Daten (gefüllt irgendwo) ...

List<Traveller> Travellers; 

... und dann diese LINQ-Abfrage:

Ich verstehe die Abfrage nicht: Was bedeutet die "Any" -Funktion und was macht der "=>" Operator?

Kann mir jemand erklären, was in diesem Code ist los? Vielen Dank!

Antwort

1

Die Linie

 
a => a.Country == "F" 

zu so etwas wie dies übersetzen würde, wenn es eine abgetrennte LINQ-Anweisung ist:

 
From a as Adress in t.TravelRoute 
Where a.Country = "F" 
Select a 

Das alle Mittel es: Irgendein. Mit anderen Worten, es wird wahr zurück, wenn eines der Objekte in seine Travel Land-Eigenschaft auf „F“

Hoffnung, die

+0

Also, bedeutet es, dass dieser "Lambda-Ausdruck" nur eine Abkürzung für eine andere "verschachtelte" LINQ-Abfrage ist? Nur etwas Code kompakter zu schreiben? – Slauma

+0

Lambda-Ausdruck, auch als Inline-Ausdruck bekannt, wird normalerweise für eine einmalige Funktion geschrieben und ist normalerweise kompakter. Sie müssen keinen Typ für das Argument angeben, da dies zu einer Ableitung führt. Ich sage ja, Sie können es durch eine verschachtelte LINQ ersetzen, aber ich kenne LINQ nicht genug, um zu sagen, dass das Schreiben der LINQ, die ich in einem anderen LINQ geschrieben habe, genau so funktioniert. –

+0

Um genauer zu sein, kann der Lambda-Ausdruck auch in einen Ausdrucksbaum übersetzt werden, der vom LINQ-Provider verwendet wird, um ihn in einen anderen Codeabschnitt wie einen SQL-Ausdruck zu übersetzen. –

7

Es wählt alle Reisende, deren Travel enthält ein Land, das „F“ ist.

Die Funktion Any gibt true zurück, wenn eines der Objekte in der Liste die Bedingung erfüllt, die an die Funktion übergeben wurde. Von der Methodensignatur, können Sie sehen, es eine Func<> Delegat nimmt, die ein bool zurückgibt. Das bedeutet, dass jede Methode verwendet wird, die einen Booleschen Wert zurückgibt, einschließlich des angegebenen Lambda-Ausdrucks.

Dies unterscheidet sich von Where, die entsprechend der Bedingung, die Filter werden in übergeben wird.

Der> = a lambda expression ist. In diesem speziellen Fall ist es eine Abkürzung, um eine anonymous delegate zu schreiben.

+3

Es ist wahrscheinlich darauf hingewiesen wird, hilft, dass 'Any' ein Gegenstück zu' All' ist ; 'All' gibt true zurück, wenn * jedes * Element der Sammlung die Bedingung erfüllt (im Wesentlichen eine lange Folge von' und' Anweisungen) und bei einem Fehler auf 'false' kurzgeschlossen wird, während' Any' bei * any * -Elementen den Wert true zurückgibt der Sammlung erfüllt die Bedingung (im Wesentlichen eine lange Reihe von "oder" Anweisungen) und Kurzschlüsse zu "wahr" auf einem Durchlauf. –

+0

Ich denke nicht, dass dies richtig ausgedrückt wird.Das Schlüsselwort where wählt jedes Objekt aus, das die Bedingung erfüllt. In diesem Fall muss mindestens eine TravelRoute vorhanden sein, für die das Prädikat true zurückgibt. Ich denke, es ist wichtig, den Unterschied zu beachten. –

+0

Dank Adam, diese Erklärung von "Any" war ziemlich klar! – Slauma

0

Beliebige ist eine Filtermethode, die besagt "Akzeptieren Sie alle Elemente, die die folgenden Kriterien erfüllen." Die a => ... Unternehmen bedeutet „ein Parameter einer gegebenen, hier ist eine Methode“ - wie schon andere gesagt haben, ist es für Lambda-Ausdrücke verwendet wird. Edit: geändert "Eigenschaft" auf "Parameter"

+0

Wie kann der Compiler wissen, welchen Typ der Parameter a hat? Der Typ ist nicht angegeben, da nur ein. Aber ich bekomme sogar Intellisense, die mir das Country-Mitglied anbietet. Es ist schön und korrekt, aber schwer zu verstehen ... – Slauma

+0

Lambda-Ausdruck sind in der Regel kryptisch in ihrer Syntax, aber klein und effizient. –

+0

Der Compiler kann oft den Typ anhand seiner Verwendung ableiten. In diesem Fall benötigt die Signatur für die Funktion Any() einen Parameter vom Typ Func , was bedeutet, dass eine Funktion gewünscht wird, die eine Zeichenkette akzeptiert und eine bool - eine Standardfilterfunktion - zurückgibt. So weiß der Compiler, wie man das Lambda behandelt, und wenn Sie beispielsweise das Lambda schreiben, um ein int zurückzugeben, erhalten Sie einen Compilerfehler. – expedient