Laden...

String Array in einer Klasse

Erstellt von Krumnix vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.127 Views
K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 5 Jahren
String Array in einer Klasse

Hallo.

Ich möchte gerne in einer Klasse eine String Array erweitern, bzw. initialisieren.

Beispiel:


public class CSVImport
    {
        public string[] NumberInCSV { get; set; }

        public static CSVImport ReadCSV(string FileName)
        {
            var data = new CSVImport();
            string CSVLine;

            if (File.Exists(FileName))
            {
                int CSVLineCount = 0;
                StreamReader sr = new StreamReader(FileName, Encoding.Default);
                while ((CSVLine = sr.ReadLine()) != null)
                {
                    if (CSVLineCount > 0)
                    {
                        string[] m_ContainerSpalte;
                        m_ContainerSpalte = CSVLine.Split(new char[] { ',' });
                        data.NumberInCSV[CSVLineCount +1] = m_ContainerSpalte[0];
                    }
                    CSVLineCount++;
                }
                return data;
            }
            else
            {
                MessageBox.Show("Die angewählte CSV-Datei wurde nicht gefunden!", CSV-Datei nicht gefunden!");
                return data;
            }
        }
    }

NummerInCSV soll dann später ausserhalb der Klasse sowie in der Klasse weiter genutzt werden können.
Auch möchte ich über eine Vererbung erreichen, dass ich NummerInCSV nutzen kann.

Leider weiß ich aktuell noch nicht, wie ich, ohne zu wissen, wie "groß" die CSV-Datei ist, NummerInCSV korrekt zu initialisieren.
Ich habe logischerweise immer eine NULL Exception.

Gibs noch einen andere Möglichkeit oder einen anderen Weg?

Danke!

16.806 Beiträge seit 2008
vor 5 Jahren

Auch hier gilt: [Artikel] Drei-Schichten-Architektur
Du mischt so alles, was man nur mischen kann 😉

Vererbung ist der absolut falsche Weg.
Saubere Trennung wäre der richtige Weg.

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 5 Jahren

Warum keine

(I)List<string>  

?

Weil hier das gleiche Problem vorliegt 😃
NullReferenceException.

Der Constructor weiß ja beim Aufruf der Class noch nicht, wie groß das Array sein soll und wie es initialisiert werden soll.
Das fehlt mir hier.
Dabei ist es egal ob es ein String-Array oder eine List of String ist.

Ich möchte ja ungern von außen schon Vorbereitung treffen, um diese der Klasse mitzuteilen. Die Klasse sollte soweit selbst sich alles hernehmen und mir dann das gewünschte Ergebnis liefern. Das wäre hier mein Ziel 😃

@Abt: Vererbung ist nun bissel klarer. Lasse ich erstmal außen vor. Das war wohl ein wenig zu voreilig.

4.931 Beiträge seit 2008
vor 5 Jahren

Sorry, aber da scheinen dir einige Grundlagen zu fehlen.
Eine List<T> vergrößert sich automatisch bei Bedarf. Sie muß nur, wie jedes andere Objekt auch, einmalig erzeugt werden.
Also ausgehend von


public List<string> NumberInCSV { get; private set; }

im Konstruktor


NumberInCSV = new List<string>();

oder aber (ab neueren C#-Versionen)


public List<string> NumberInCSV { get; private set; } = new List<string>();

Und dann die Elemente mittels Add(...) hinzufügen (nicht über den Index-Operator, da du sonst eine IndexOutOfRangeException erhältst).

PS: private set extra, damit nicht von außerhalb jemand die ganze Liste wieder neu erzeugen kann (oder sogar auf null setzt)!

Persönlich würde ich sogar eine IList<T> bzw. IReadOnlyList<T> als Schnittstelle bevorzugen.

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 5 Jahren

oder aber (ab neueren C#-Versionen)

  
public List<string> NumberInCSV { get; private set; } = new List<string>();  
  

Nein, das mit dem Add hab ich drin. Ich hab in dem Fall alles mal ausprobiert.

Aber deine Zeile da oben war die Lösung.
Vielen Dank.

In Sachen Klassen habe ich zwar schon viel gelesen, aber in der Praxis sieht man manchmal vor lauter Buchstaben die Lösung nicht.

Funktioniert!