myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Besser ArrayList oder List<T> verwenden? Unterschiede?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Besser ArrayList oder List<T> verwenden? Unterschiede?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
BIT_0_1
myCSharp.de-Mitglied

Dabei seit: 03.01.2016
Beiträge: 65


BIT_0_1 ist offline

Besser ArrayList oder List<T> verwenden? Unterschiede?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
           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:

C#-Code:
            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:

C#-Code:
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

C#-Code:
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:

C#-Code:
           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.
06.03.2016 16:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Papst Papst ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.09.2014
Beiträge: 220
Entwicklungsumgebung: VS2017
Herkunft: Kassel


Papst ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
06.03.2016 18:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.160
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
06.03.2016 19:29 Beiträge des Benutzers | zu Buddylist hinzufügen
BIT_0_1
myCSharp.de-Mitglied

Dabei seit: 03.01.2016
Beiträge: 65

Themenstarter Thema begonnen von BIT_0_1

BIT_0_1 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

C#-Code:
  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
07.03.2016 09:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.160
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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%).
07.03.2016 09:49 Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.975
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

LaTino

C#-Code:
//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);
}
07.03.2016 09:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BIT_0_1
myCSharp.de-Mitglied

Dabei seit: 03.01.2016
Beiträge: 65

Themenstarter Thema begonnen von BIT_0_1

BIT_0_1 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Gruß Bit
07.03.2016 15:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Jahre.
Der letzte Beitrag ist älter als 3 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 11.11.2019 21:22