2016-04-21 5 views
2

Nicht sicher, warum das nicht funktioniert, es ist von Code angepasst, der funktioniert. Sieht so aus, als ob ich eine explizite Besetzung brauche, aber ich bin mir nicht sicher, warum oder wo ich es ausdrücken soll. Der Fehler ist:Fehler bei CSV zu Dictionary

„Kann nicht implizit Typ 'System.Collections.Generic.IEnumerable {System.Collections.Generic.Dictionary {string, string}}' auf‚System.Collections.Generic.Dictionary {string umwandeln, string} '“

public static Dictionary<string, string> Data_Entry(string dataEntity, string dataCategory, string dataStream = "") 
    { 
     var lines = File.ReadAllLines(@"C:\MyFile.csv"); 
     var header = lines.First().Split(','); 
     return (from line in lines.Skip(1) 
      let cols = line.Split(',') 
      where cols[0].ToUpper() == dataEntity & cols[1].ToUpper() == dataCategory & cols[4].ToUpper() == dataStream 
      select header.Select((h, i) => new { header = h, index = i }) 
      .ToDictionary(o => o.header, o => cols[o.index]) 
     ); 
    } 
+0

Es könnte helfen, wenn Sie genau erklären, was dieser Code zu tun versucht. Es gibt ein paar Antworten, die richtig darauf hinweisen, dass Ihr deklarierter Rückgabetyp und Ihre Rückkehranweisung in Konflikt stehen, aber es ist schwer darüber hinauszugehen, ohne Ihr Ziel zu kennen. –

+0

Ich möchte eine einzelne übereinstimmende Zeile aus der strukturierten CSV (nur eine Übereinstimmung ist möglich) über die Where-Klausel sowie die Kopfzeile ziehen, mit den Header-Werten als Schlüssel und den Zeilenwerten als Werte im zurückgegebenen Dictionary. – xnguyeng

Antwort

4

Ihre Linq Abfrage zurückgibt ein IEnumerable<T> Objekt, in dem T vom Typ Dictionary ist statt dessen, was man als Wörterbuch erwarten.

Wenn ich Ihren Code verstehe, möchten Sie im Wesentlichen eine Liste von Wörterbüchern erstellen, wobei die Spaltenüberschrift der Schlüssel ist und der Spaltenindexwert der Zeile der Wert ist. Da Wörterbücher keine doppelten Schlüssel haben können, können Sie das gesamte Ding nicht in ein Wörterbuchobjekt umwandeln, da es Ausnahmen von den doppelten Schlüsseln geben wird.

Also im Wesentlichen möchten Sie den ToDictionary() -Aufruf aus der Linq-Anweisung ziehen und es auf das Ergebnis der Linq-Anweisung anwenden, stattdessen um Ihr Wörterbuch zu erhalten. Leider führt dies dazu, dass die doppelten Schlüsselfehler mit der Art und Weise, wie sie aktuell codiert sind, verglichen werden, anstatt ein Wörterbuch zurückzugeben, könnten Sie eine andere Datenstruktur betrachten oder den Rückgabetyp zu einem IEnumerable<Dictionary<string,string>> Typ ändern.

Bearbeiten: Basierend auf den Follow-up-Informationen in den Kommentaren erhalten Sie die folgenden erhalten Sie, wo Sie sein müssen. Beachten Sie, dass ich den FirstOrDefault() - Aufruf den Ergebnissen der Linq-Abfrage hinzugefügt habe. Dies bedeutet, dass das erste Ergebnis (Typ Dictionary<string,string>) zurückgegeben wird, das den Rückgabetyp der Methode erfüllt. Es lohnt sich, den Calling-Code für eine Nullrückgabe einzuplanen, nur für den Fall, dass Sie sicher sind, dass es niemals null sein wird.

public static Dictionary<string, string> Data_Entry(string dataEntity, string dataCategory, string dataStream = "") 
{ 
    var lines = File.ReadAllLines(@"C:\MyFile.csv"); 
    var header = lines.First().Split(','); 
    return (from line in lines.Skip(1) 
     let cols = line.Split(',') 
     where cols[0].ToUpper() == dataEntity & cols[1].ToUpper() == dataCategory & cols[4].ToUpper() == dataStream 
     select header.Select((h, i) => new { header = h, index = i }) 
     .ToDictionary(o => o.header, o => cols[o.index]) 
    ).FirstOrDefault(); 
} 
+0

Der Code, aus dem dieser Code erstellt wurde, hat eine Liste >. In diesem Fall möchte ich eine einzelne Zeile aus der strukturierten CSV-Datei ziehen. Die where-Klausel stellt sicher, dass ein eindeutiger Schlüssel gezogen wird, da nur eine einzelne Zeile übereinstimmt. – xnguyeng

+0

In diesem Fall verschieben Sie das ToDictionary außerhalb der Linq-Anweisung, so wie es jetzt angewendet wird, und daher gibt die Abfrage ein IEnumerable von Wörterbüchern zurück. – exceptionthrown

+0

Das klingt richtig, aber ich bin mir nicht sicher, wie ich es erreichen soll. Wenn ich die Anweisung so wie sie ist herausziehen, sind die Variablen innerhalb der Linq-Anweisung außerhalb des Gültigkeitsbereichs. – xnguyeng