Announcement

Collapse
No announcement yet.

ArrayList Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ArrayList Problem

    Hallo,

    hab (mal wieder) ein kleines Problem.
    Also ich habe eine Textdatei mit dem Aufbau

    str1a; str1b; str1c; str1d
    str2a; str2b; str2c; str2d
    str3a; str3b; str3c; str3d
    str4a; str4b; str4c; str4d

    Alle strXa Elemente sollen zur Datensatzauswahl in einer Combobox landen. Mein Problem ist nun, dass an Stelle von str1a, str2a... immer nur str4a (d.h.das letzte Element) dort landet.

    Die zwei Klassen zum Einlesen der Testdatei:

    class adr_t {
    string[] s;
    int length;

    // Constructor
    public adr_t(int len) {
    if (len > 0) {
    s = new string[len];
    this.length = len;
    } else {
    MessageBox.Show("Adressindexfehler",
    Application.ProductName,
    MessageBoxButtons.OK,
    MessageBoxIcon.Error);
    }
    }

    public int Length { get { return length; } }

    // Indexer
    public string this[int i] {
    get {
    if (i < 0 || i >= length) {
    throw new IndexOutOfRangeException(); }
    return s[i]; }
    set {
    if (i < 0 || i >= length) {
    throw new IndexOutOfRangeException(); }
    s[i] = value; }
    }
    }
    //--------------------------------------------------------------------------
    class Adressen {
    const int adrparts = 4; // 4 Felder pro Adresse
    int cnt;
    adr_t a;
    ArrayList lst;

    // Constructor
    public Adressen(string fn) {
    try {
    a = new adr_t(AdrParts);
    lst = new ArrayList();

    using (StreamReader sr = new StreamReader(fn)) {
    string line;
    string[] split = new string[adrparts];
    while ((line = sr.ReadLine()) != null) {

    // faengt Leerzeilen ab, AdrParts -1 Delimiter sind möglich
    if (line.Length > adrparts - 1) {
    split = line.Split(';');
    for (int i=0; i<adrparts; i++) { a[i] = split[i]; }
    lst.Add(a);
    cnt++;
    } // if
    } // while
    } // using
    } catch (Exception ex) {
    MessageBox.Show("Anwendungsfehler: " + ex.Message,
    Application.ProductName,
    MessageBoxButtons.OK,
    MessageBoxIcon.Error); }
    } // constructor Adressen

    public adr_t this[int i] { get { return (adr_t)lst[i]; } }
    public int count { get { return cnt; } }
    public int AdrParts { get { return adrparts; } }

    }
    }

    Nun der Zugriffseil in der Klasse MainForm:
    ...
    Adressen adressen = new Adressen(PathADR);
    ...

    // Combobox mit 1. Zeile der jeweiligen Adresse fuellen
    for (int i=0; i<adressen.count ; i++) { cbREan.Items.Add(adressen[i][0]); }

    Was mache ich falsch ???
    Danke für jeden Hinweis

    Gruß
    Horst

  • #2
    Hallo,

    &gt;Was mache ich falsch ???

    Um einmal überspitzt zu antworten: Der Fehler besteht darin, die im .NET Framework vorhandenen Klassen <b>nicht</b> zu nutzen :-)
    <br>
    Die Aufgabe lässt sich mit der Kombination von <b>Regex</b> und <b>DataTable</b> sehr schnell lösen. Angenommen, in der Textdatei stehen die folgenden Daten:
    <code>
    01234567;100
    87654321;1
    </code>
    Dann könnte der Inhalt über den folgenden Weg in eine DataTable-Instanz kopiert werden, damit die Combobox über die Datenbindung ihre Werte erhält:
    <code>
    <b>using</b> System.Data;
    <b>using</b> System.IO;
    <b>using</b> System.Text.RegularExpressions;
    ...
    <b>private</b> <b>string</b> cREStr = @<font color="#9933CC">&quot;(\d{8});(\d+)&quot;</font>;

    <b>public</b> DataTable CSV2DataTable(<b>string</b> sCSVFilename)
    {
    <b>string</b> sCSVData;
    DataTable aDT = <b>null</b>;
    StreamReader aSR = <b>new</b> StreamReader(sCSVFilename);
    <b>try</b>
    {
    sCSVData = aSR.ReadToEnd();
    }
    <b>finally</b>
    {
    aSR.Close();
    }
    aDT = <b>new</b> DataTable();
    aDT.Columns.Add(<font color="#9933CC">&quot;Spalte1&quot;</font>, <b>typeof</b>(<b>String</b>));
    aDT.Columns.Add(<font color="#9933CC">&quot;Spalte2&quot;</font>, <b>typeof</b>(Int32));
    Regex aRegEx = <b>new</b> Regex(cREStr);
    aDT.MinimumCapacity = aRegEx.Matches(sCSVData).Count + 1;
    <b>foreach</b>(Match aMatch <b>in</b> aRegEx.Matches(sCSVData))
    {
    aDT.Rows.Add(<b>new</b> <b>Object</b>[] {aMatch.Groups[1].Value, aMatch.Groups[2].Value});
    }
    <b>return</b> aDT;
    }
    </code&gt

    Comment


    • #3
      Hallo Herr Kosch,

      erst eimal vielen Dank für Ihre Antwort.
      Der Hinweis "die im .NET Framework vorhandenen Klassen nicht zu nutzen" trifft den Kern meines Problems auf der einen Seite sehr genau. Andererseits ist es bei mir (und ich denke bei vielen anderen auch) so, daß gerade wenn man von anderen Sprachen kommt, in meinem Fall C/c++, zuerst die schon bekannten Sprachelemente genutzt werden. Ihre Lösung muss ich erst einmal *verdauen*, da ich beide Konzepte, Regex und DataTable, zwar kenne, aber noch nie damit gearbeitet habe.
      Nichtdestoweniger, ist der von mir gewähle Lösungsansatz gänzlich unbrauchbar, oder führt er auch Lösung des Problems, wenn er korrekt programmiert wird? Nur, wo liegt der Fehler ??

      Gruß
      Hors

      Comment

      Working...
      X