2016-04-27 11 views
2

Ich habe folgende Linq query:Linq Abfrage ToList() ist leer, aber foreach funktioniert

IEnumerable<Network> net = from file in Directory.GetFiles(folder+ @"\network") 
          from lines in File.ReadLines(file).Skip(1) 
          let row = lines.Split(',')   
          select new Network 
          { 
           networkname = getnetwork(row), 
           ... 
           networkdate = getnetworkdate(row) 
          }; 

wenn ich ToList() darauf verwenden, die Liste ist leer, aber wenn ich eine foreach-Schleife, wo ich eine leere Liste und fügen Sie jedes Element hinzu, ist es nicht. Habe ich bei dieser Abfrage einen Fehler gemacht oder könnte es eine andere Quelle für dieses seltsame Verhalten geben?

UPDATE: ich es in einer Verlängerung Methode wie folgt bin mit: Dies funktioniert nicht:

public static void FillFromCsv(this List<Network> network) 
    { 
     [QUERY HERE] 

     network = net.toList(); 
    } 

Dies funktioniert:

public static void FillFromCsv(this List<Network> network) 
    { 
     [QUERY HERE] 

     network.Clear(); 
     Foreach (Network n in net) 
     { 
      network.add(n); 
     } 
    } 
+1

Können Sie zeigen, wie Sie 'ToList' und' ForEach' verwenden? Ist es wichtig, in welcher Reihenfolge du sie tust? –

+0

Dies kann durch verzögerte Ausführung von Linq verursacht werden, aber ich bin mir nicht sicher. – Nzall

+0

Wo ist die Dateierweiterung für @ "\ network"? – Auguste

Antwort

3

Ihr Problem nichts mit foreach zu tun hat vs ToList. Das Problem ist, dass in dem ersten Verfahren Sie die Liste nicht ändern, die in übergeben werden Sie überschreiben die lokale Referenz mit einer neuen Referenz:.

public static void FillFromCsv(this List<Network> network) 
{ 
    [QUERY HERE] 

    // this only affects the _local_ "network" reference, not the reference passed in 
    network = net.toList(); 
} 

Sie könntest die Parameter ändern ein ref Parameter, aber warum überhaupt eine Erweiterungsmethode verwenden? Warum hat der Anrufer eine Liste übergeben, wenn Sie ihn einfach wegblasen wollen? Ich würde

public static IEnumerable<Network> FillFromCsv() 
{ 
    [QUERY HERE] 

    return net.ToList(); 
} 

Bei der zweiten Methode nur tun, werden Sie die Liste Instanz Clearing, die in und durch Hinzufügen der Ergebnisse an sie übergeben wird. Was ist in Ordnung, aber es ist verschiedene, was Sie in der ersten Methode tun.

Sie konnte die foreach vermeiden, indem sie gerade tun:

public static void FillFromCsv(this List<Network> network) 
{ 
    [QUERY HERE] 

    network.Clear(); 
    network.AddRange(net); 

} 

Aber es scheint seltsam den Anrufer haben Sie eine Liste übergeben und Sie klar, und es zu füllen. Eine bessere Methode wäre, nur eine eine Liste (wie der erste Vorschlag).

+0

Danke für Ihre Hilfe D Stanley. Ich verwende Erweiterungen, weil ich eine zusätzliche statische Klasse für den Umgang mit CSV-Dateien als Eingabe habe. Ich mag es, wenn Methoden mit nahezu gleicher Funktionalität "zusammenkleben". Das ist kein wirklicher rationaler Grund, ich finde es einfach klarer, wenn die gleiche Funktionalität zusammen gruppiert wird. Also würde ich wahrscheinlich dabei bleiben. Auf der anderen Seite, vielleicht sollte ich einen besseren Ansatz verwenden, wie Sie erwähnt haben. Ich werde ein Bier darüber trinken. Danke vielmals :-) –

Verwandte Themen