2017-06-22 3 views
0

Wenn Sie den folgenden Code ausführen:GetFiles und EnumerateFiles überspringen Sie die foreach-Schleife

var files = dir.EnumerateFiles("*.*", 
    SearchOption.AllDirectories).Where(f => ext.Contains(Path.GetExtension(f.FullName))) 
foreach (FileInfo file in files) 
    { 
    file.CopyTo(destPath, true); 
    } 

Wo dir ist ein Directory
Wo ext ist eine Liste von Strings akzeptiert Dateierweiterungen enthalten

Upon auf die Foreach-Schleife, Dateien ist null.
Innerhalb der foreach (am in-Anweisung), springt das Programm zurück zur => Anweisung füllt dann Dateien. Wenn es fertig ist, springt es über die foreach-Schleife und tritt nie in es ein.

Ich bin hier verloren. Warum springt mein Code eine Zeile zurück? Ich habe versucht Enumerate und GetFiles, keiner scheint zu funktionieren.

+0

Vielleicht sind die Erweiterungen benötigen ein Punkt in der ext-Liste – Slai

+0

Das hat auch funktioniert. Danke für die Hilfe. –

Antwort

0

Der Grund für den Code "zurückspringen" ist etwas, das Deferred Execution genannt wird. Der LINQ-Ausdruck, den Sie dort haben, wird nicht wirklich ausgeführt, bis die Ergebnisse in der foreach-Schleife verwendet werden.

Wie zum Überspringen der foreach-Schleife - das passiert, weil die Aufzählung leer ist. Wie @Slai in einem Kommentar erwähnt, könnte es ein Problem mit Ihrer Erweiterungsliste geben (das '.' Zu vergessen, bevor der Erweiterungsname ein häufiger Fehler ist).

Wenn Sie wollen, dass die Aufzählung sofort auszuführen, anstatt verschoben zu werden (macht das Debuggen einfacher), der einfachste Weg ist nur Ihre LINQ-Ausdruck mit einem .ToList zu beenden() wie folgt:

var files = dir.EnumerateFiles("*.*", SearchOption.AllDirectories) 
    .Where(f => ext.Contains(Path.GetExtension(f.FullName))) 
    .ToList(); 
+0

Ich werde über diese verzögerte Ausführung nachlesen müssen. Das hat es definitiv behoben. Vielen Dank. –

Verwandte Themen