2017-04-04 2 views
0

Ich habe eine Frage zu LINQ-Abfragen und Rückgabetypen. Ich möchte nur Werte aus einer .csv-Datei lesen, in der doppelte Werte durch ein Semikolon wie folgt getrennt sind:Lesen von .csv-Datei in Doppel-Array

0,016; 0,010; -0,020; -0,014; 0,020; 0,016; -0,019; -0,014; 0,023;

Das Lesen aus der Datei arbeitet mit der folgenden Aussage fein:

 double pdValue; 
     double[] pdValues; 

     var values = File.ReadAllLines(path) 
      .Select(a => a.Split(';') 
      .Select(str => double.TryParse(str, out pdValue) ? pdValue : 0)); 

     pdValues = values.ToArray(); 

Aber die letzte Zeile gibt den ‚umwandeln kann nicht implizit System.Collections.Generic.IEnumerable < double> [] zu verdoppeln‘ Fehler. Wenn versucht wird, es mit Array zu arbeiten, ändert sich der Fehler in 'Kann nicht implizit konvertieren System.Collections.Generic.IENumerable < double> [] zu double []'.

Beim Debuggen, ich kann schon sehen, dass die Werte Variable alle Werte aus der Datei hält (irgendwie) als Array ...

ich noch nichts gefunden, was mir einen Tip geben könnte, was genau ich mache ich hier falsch. Kann mir jemand helfen?

Vielen Dank im Voraus!

+1

Ok sagte Sie die Werte Variable alle Werte aus der Datei hält (irgendwie) als Array .. err cos Sie sagte a.Split (';') .. so seine jetzt ein Array von Strings ... – BugFinder

+0

Es ist sinnvoller, die 'File.ReadLines' anstelle der' File.ReadAllLines' zu verwenden, da die 'File.ReadLines' die Daten streamen, anstatt sie vollständig in den Speicher zu laden. –

+2

Die Datei enthält mehr als eine Zeile? Es wäre also ein 'double [] []' Was brauchst du als Ergebnis? 'double [] []' oder 'double []' _ (alle Zeilen zusammengeführt) _ –

Antwort

2

Schauen Sie sich den Variablentyp values an, der IEnumerable<IEnumerable<double>> ist. Sie sollten diesen Code verwenden:

var values = File.ReadAllLines(path) 
      .SelectMany(a => a.Split(';') 
      .Select(str => double.TryParse(str, out pdValue) ? pdValue : 0)); 

pdValues = values.ToArray(); 
+0

Vielen Dank, die .SelectMany-Anweisung hat es behoben! – mrpip

0

Die ReadAllLine Methode wird ein Array von Strings zurückgeben (Lets Array A sagen). Die Split Methode, die Sie verwendet haben, wird Ihnen ein Zeichenfolgenarray geben, das durch ";" für jedes Element von Array A. Also wäre das Endergebnis ein Array Array. Das ist der Grund für den Fehler.

können Sie versuchen:

var values = File.ReadAllLines(path).ToString() 
      .Split(';').Select(str => double.TryParse(str, out pdValue) ? pdValue : 0);