LINQ-Abfrage - Erläuterung, warum diese Beispiele unterschiedlich sind

8

Ich lese das Buch "LINQ Pocket Reference" und es gibt ein spezielles Beispiel (leicht modifiziert unten), dass ich Schwierigkeiten habe, mich um mich zu kümmern ... Die Erklärung in dem Buch ist ein bisschen kurz, also habe ich mich gefragt, ob jemand es für mich Schritt für Schritt abbrechen könnte, damit es Sinn macht ...

%Vor%

Gibt Folgendes aus:

%Vor%

Was mir vollkommen Sinn macht ... Das tut es aber nicht.

%Vor% %Vor%

was nicht ...

Kann mir jemand genauer erklären, was genau hier vor sich geht?

    
Andrew Rollings 23.12.2008, 19:01
quelle

2 Antworten

10

Was mit dem ersten Beispiel passiert, ist, dass der Wert des Vokals in eine lokale Variable (für den Umfang der for-Schleife) eingefangen wird.

Die where-Klausel für die Abfrage verwendet dann diese erfasste Variable. Where-Klauseln verwenden eine anonyme Methode / Lambda-Methode, die lokale Variablen erfassen kann. Was passiert dann ist, dass es den aktuellen Wert der Variablen erfasst.

In der zweiten Klasse wird jedoch nicht der aktuelle Wert erfasst, sondern nur die zu verwendende Variable, und somit, da sich diese Variable ändert, erstellen Sie bei jeder Ausführung der Schleife eine neue Where-Klausel über der der letzte, aber Sie ändern auch alle vorhergehenden, seit Sie die Variable ändern.

Im ersten Beispiel erhalten Sie diese Art von Abfrage:

%Vor%

Im zweiten Beispiel erhalten Sie Folgendes:

%Vor%

Wenn Sie dieses zweite Beispiel ausführen, wird der Wert von vowel "u" sein, sodass nur die u entfernt wird. Sie haben jedoch 5 Schleifen über die gleiche Saite, um das "u" zu entfernen, aber nur die erste wird es natürlich tun.

Diese Erfassung von Variablen ist eines der Dinge, über die wir alle stolpern, wenn Sie anonyme Methoden / Lambdas verwenden, und Sie können hier mehr darüber lesen: C # in der Tiefe: Die Schönheit der Verschlüsse .

Wenn Sie diese Seite unter Vergleich von Erfassungsstrategien: Komplexität vs. Leistung nach unten durchsuchen, finden Sie einige Beispiele für dieses Verhalten.

    
Lasse Vågsæther Karlsen 23.12.2008, 19:08
quelle
1

Eigentlich macht es beim nochmaligen Lesen Sinn. Die Verwendung der Temp-Variable bedeutet, dass die Temp selbst in der Abfrage erfasst wird ... Wir bewerten die Schleife fünf Mal und daher gibt es fünf instanziierte Temp-Variablenreferenzen für jede Version der Abfrage.

Im Fall ohne die temp-Variable gibt es nur den Verweis auf die Schleifenvariable.

Also fünf Referenzen gegen eine Referenz. Deshalb erzeugt es die Ergebnisse wie gezeigt.

Wenn im ersten Fall die Schleife vollständig ausgewertet wurde, hat die Abfrage die fünf Referenzen auf die temporären Variablen verwendet und damit a, e, i, o und u entfernt.

Im zweiten Fall macht es dasselbe ... nur alle fünf Referenzen beziehen sich auf dieselbe Variable, die offensichtlich nur einen Wert enthält.

Moral der Geschichte: Denken Sie "Referenz" nicht "Wert".

Macht das jetzt für irgendjemanden Sinn?

    
Andrew Rollings 23.12.2008 19:09
quelle

Tags und Links