Laden...

Besser ArrayList oder List<T> verwenden? Unterschiede?

Erstellt von BIT_0_1 vor 8 Jahren Letzter Beitrag vor 8 Jahren 6.159 Views
B
BIT_0_1 Themenstarter:in
65 Beiträge seit 2016
vor 8 Jahren
Besser ArrayList oder List<T> verwenden? Unterschiede?

Hallo zusammen,

ich muss Text files in mein Programm einlesen. Dabei hat das File ein bestimmtes Format z.B

Zeile mit strings
Zeile mit strings
Zeile mit strings --> (Das ist eine Beschreibung können auch mehr als drei Zeilen sein)
Dann Zeile mit strings durch Semikolon getrennt (dass sind die Einheiten und Namen der Messwerte)
Messdaten in double durch Semikolon getrennt

Momentan habe ich das mit zweidimensionalen Arrays folgendermaßen gemacht:


           string[] Daten = File.ReadAllLines(string.Concat(Path, Filename));
           string[] Line = Daten[0].Split(new Char[] { ';' });

           int x_Length = Line.Length;
           int y_Length = Daten.Length;

           string[,] String_Tabelle = new string[x_Length, y_Length];
           double[,] Double_Tabelle = new double[x_Length, y_Length];

            for (int row = 0; row < Map_File_y_Length; row++)
            {
                Line = Daten[0 + row].Split(new Char[] { ';' });

                for (int column = 0; column < x_Length; column++)
                {
                    String_Tabelle[column, row] = Line[column];

                   if (row != 0 )     //die ersten Zeilen lasse ich in dem Array of double einfach weg da in diesen Zeilen ja strings sind. 
                    {
                        Double_Tabelle[column, row] = Convert.ToDouble(String_Tabelle[column, row]);              
                    }
                }
            }


insgesamt ist das eher schlecht obwohls funktioniert. Da die Arrays ja nicht dynaimisch sind, und ich diese umständliche Konvertierung durchführen muss.

Bei ArrayList ist der Datentyp egal, steht in meinem Buch, man muss halt wissen welcher Datentyp sich ab welchen index befindet. Auch steht drin das neu hinzugefügte Elemente immer an das Ende angehängt werden, ich kann so also nicht zwischen rein was quetschen wenn ichs brauch?

ist das bei List<T> anders? Klar sind diese Listen typisiert, aber kann ich zwischen drin was einfügen?

Mein größtes Problem allerdings ist, dass ich in eine Liste zwar die informationen bekomme:



            List<string> liste = new List<string>();
            liste .AddRange(File.ReadAllLines(string.Concat(Path, Filename)));
oder:
            ArrayList liste = new ArrayList();
            liste.AddRange(File.ReadAllLines(string.Concat(Path, Filename)));

und auch ausgeben kann:


 Console.WriteLine(liste[0]);

Aber wird so ja immer eine ganze Zeile ausgegeben.
ich muss jetzt die Daten wie im ersten Array Beispiel ab dem Semikolon spliten und dann in einer Zweidimensionale Liste

List<List<string>> liste = new List<List<string>>();

speichernchen zu können. Aber wie geht das? ich bekomms nicht hin.

zusammenfassen wäre mir wichtig die Daten aus dem Textfile einzulesen und nur eine Liste zu haben nicht wie mit den Arrays einmal string und dann double Array.
Der stringanteil im header muss bleiben, die brauch ich ja um zu wissen welcher Messwert welchem Label zugeordnet wird.
Das ganze muss dynamisch sein also ohne:


           int x_Length = Line.Length;
           int y_Length = Daten.Length;

Ich muss auf die einzelnen Elemente zugreifen können wie in einem zweidimensionalen Array. Danke für Hilfe Ratschläge und Anregungen.

Und einen Gruß hinterher.

P
441 Beiträge seit 2014
vor 8 Jahren

Hi,

du könntest eine DataTable verwenden, wenn die Inhalte der Datei immer anders sein können oder eine typisierte Liste mit einer eigenen Klasse, wenn sich die Inhalte der Datei niemals ändern (--> List<T>).

Statt Convert.ToDouble() würde ich besser Double.TryParse() verwenden, damit bist du gegen Fehler in der Datei besser gewappnet.

Ansonsten gibt es zuhauf CSV-Parser Klassen auf stackoverflow oder codeplex.

16.806 Beiträge seit 2008
vor 8 Jahren

Es gibt absolut keine Grund mehr ArrayList zu verwenden. Man sollte es auch am besten sofort wieder vergessen.

In C# arbeitet man typisiert und mit Objektorientiertem Ansatz.

Spätestens mit einem gemeinsamen Interface aller potentiellen Einträgen ist dies zu lösen.

B
BIT_0_1 Themenstarter:in
65 Beiträge seit 2016
vor 8 Jahren

Danke für die Antworten und Ratschläge damit kann ich schon was anfangen.
Ich werde zum einen TryParse und zum andren die List verwenden.

Doch auch nach weiteren Recherchen (Buch wie internet) kann ich keine hilfreichen Beispiele finden, wie ich die Werte gesplittet in ne Liste bekomme und ausgeben kann.

  Line = Daten[0 + row].Split(new Char[] { ';' });

sowas in der Art.

Ich muss praktisch das text file Element für Element in die zweidimensionale Liste schrieben. Wie mache ich das?

Danke euch schonmal. Gruß Bit

16.806 Beiträge seit 2008
vor 8 Jahren

Split gibt Dir ein Array zurück - ein Array ist aber keine List.
Deswegen kannst Du es auch nicht direkt zuweisen. Sollte logisch sein.

Ergo musst Du eben mit ToList arbeiten oder darüber iterieren.
Das steht aber sogar in der Doku von Arrays und kann man auch an den verfügbaren Methoden im Intellisense sehen.

Line ist laut Deinem Code aber ein string[]-Array, keine Liste.
Ich seh auch nirgends eine zweidimensionale Liste, sondern nur zweidimensionale Arrays. Es gibt auch keine zweidimensionale Listen; wenn dann sprichst Du von Dictionaries.

PS: laut Guidelines sind Variablennamen innerhalb Methoden klein zu schreiben.
So verwirrt das beim Lesen die Leute eher, die sich an die Guidelines halten (99,9%).

3.003 Beiträge seit 2006
vor 8 Jahren

Am besten hörst du auf, mit mehrdimensionalen Arrays zu arbeiten, und schreibst dir eine Klasse, die deine Messdaten beschreibt.

LaTino


//Hilfsklasse, die die Messdaten darstellt
class SamplePoint
{
    public SamplePoint(string input)
    {
        var stringValues = input.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
        if (stringValues.Length != 2) throw new FormatException(string.Format(@"Ungültiger Eintrag: ""{0}""", input));

        double x, y;
                
        if(!double.TryParse(stringValues[0], NumberStyles.Any, CultureInfo.InvariantCulture, out x) ||  !double.TryParse(stringValues[1], NumberStyles.Any, CultureInfo.InvariantCulture, out y))
            throw new FormatException(string.Format(@"Ungültiger Eintrag: ""{0}""", input));
        X = x;
        Y = y;
    }
            
    public double X { get; private set; }
    public double Y { get; private set; }
}
//Anwendung:
var resultList = File.ReadAllLines("test.txt").Select(line => new SamplePoint(line));
foreach (var samplePoint in resultList)
{
    Console.WriteLine("X: {0}, Y: {1}", samplePoint.X, samplePoint.Y);
}

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

B
BIT_0_1 Themenstarter:in
65 Beiträge seit 2016
vor 8 Jahren

Danke Latino damit kann ich was anfangen.
Danke auch Abt für deine Hinweise. Werde ich mir merken und auch weiter nachgehen.

Gruß Bit