Laden...

eine List<string []> durchsuchen und materialisieren

Erstellt von Dacs vor 4 Jahren Letzter Beitrag vor 4 Jahren 907 Views
D
Dacs Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren
eine List<string []> durchsuchen und materialisieren

Hallo zusammen,

vielleicht habe ich einen Knoten im Kopf und ihr könnt mir vielleicht helfen. (Mein Erfahrungslevel mit Listen und Linq ist leider noch gering, sonst würde ich wohl nicht fragen X() .

Aufgabe, es müssen Daten einer CSV geprüft werden, Daten.dat. Die zu prüfenden Dinge stehen in einer weitere CSV-Datei, Parameter.dat.

Die Sätze der DatenDatei habe ich in eine Liste als bereits via Split in string[] umgewandelt, also List<string[]>.
Eine ebensolche List<string[]> gibt es auf von der Parameter.dat.

Mein Problem:
ich durchsuche die Parameter.dat mit Linq, dies findet zwar den Eintrag, aber ich bekomme ich ihn nicht materialisiert.



var param_i = from S in paraListe
                where S[feldNr].Equals(feldNr.ToString())
                              select S;

ich ging davon aus, das das Ergebinis ist param_i steht. Zumindest wird mir auch beim ersten Durchlauf das richtige Ergebnismitgeteilt, bei jedem Zugriff auf param_i wird allerdings wieder auf die Liste Zugegriffen, was so nicht gewollt ist. ich brauche ja nur einmal ein Ergebnis, nicht bei jedem Anfassen der Variabel.

Dann versuchte ich es mit der Find-Methode, x scheint mir das Element in der List zu sein, da es vom Typ string[] ist, habe ich es so ansprechen wollen ...


var param_i = paraListe.Find(x =>  x[0].Equals(feldNr))
                   { return x; } ;

... scheiterte dann bei der Bedingung, wie man das definiert.

Vermutlich ist es eine sehr logische Antwort, aber ich habe mich leider vollkommen ferheddert 🤔

Danke für`s Lesen und "Schubsen"

Hägar

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

ich behaupte jetzt einfach mal, dass hier zu wenig Code ist um dir zu helfen. (Uns fehlt zudem jegliche Debug-Info) Je nachdem was in den Variablen drinsteht könnte der Code wahrscheinlich sogar funktionieren - die Frage ist eher: Was entspricht nicht deinen Erwartungen?

Zur Verdeutlichung
Sofern du bereits ein Objekt mit dem Inhalt deiner CSV-Datei hast (scheint hier eine Art Liste/Array zu sein) hast du die Daten bereits ausgelesen. Wir reden somit gar nicht mehr von einem CSV-Problem?

Grundlegend - ich vermute, dass in deinem ersten Codeschnipsel:
a) paraListe eine List<string[]> ist (die aus Parameter.dat)
b) param_i wäre demzufolge ein string[] (also letztlich eine Zeile aus Parameter.dat)
-> Solltest du lediglich den Wert daraus haben wollen, wäre ein "select S[feldNr]" wohl das Richtige für dich

Abseits davon:
Ich finde es nicht besonders schlau eine CSV-Datei lediglich in eine List<string[]> einzulesen. Jeder der den Code verstehen möchte - muss bei dieser Implementierung auch den Aufbau der CSV-Dateien auswendig können.

Du kennst den Aufbau der CSV-Dateien und kannst problemlos eine Klasse mit sinnvollen Variablen erstellen, zu der jeweils eine Instanz pro Zeile erstellt werden kann, womit du dir das Leben bedeutend übersichtlicher gestalten könntest. Du solltest dir deshalb mal folgendes durchlesen und deinen Code entsprechend umbauen:
https://bartsimons.me/reading-csv-files-in-csharp-with-csvparser/

Danach wird sich dein Problem wahrscheinlich von allein erledigen 😉

LG

849 Beiträge seit 2006
vor 4 Jahren

Hi,

Du bekommst aus deinem Linq statement ein IEnumerable<string>

Dieser wird tatsächlich bei jeder neuen Iteration die zugrunde liegende Liste neu durchsuchen.

Um das zu unterbinden müsstest Du das Ergebnis mit .ToList() oder .FirstOrDefault() persistieren. Je nachdem wieviele Ergebnisse Du erwartest.

16.806 Beiträge seit 2008
vor 4 Jahren
D
Dacs Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren

Vielen Dank für die Antworten !

Die muss ich erstmal wiederkauen, vor allem die verschiednen Hinweise zu CSV- Verarbeitung, die mir in diesem Programm leider nicht helfen werden, denn die Zeilen haben nicht den selben Aufbau.

.FirstOrDefault() ... scheint es zu sein!

Merci