Laden...

mehrdimensionale Array, ArrayList

Erstellt von niko8380 vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.831 Views
N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren
mehrdimensionale Array, ArrayList

Hallo,
ich habe folgendes Problem, vielleicht kann mir jemand helfen.
Ich möchte die folgenden Daten in einem mehrdimensiolanen Array speichern.
Ich kenne aber die genaue Anzahl der Spalten und Zeilen nicht, wie mache ich das?
Vielleicht eine andere Datenstruktur nutzen? ArrayList? Anschließend wollte ich jedes Datum in einer Datenbank speichern.

Text1...Text2...Text3...Text4….1n
000.....0004.....0006.....0008... ,,,
001.....0004.....0004.....0004....,,,
002.....0005.....0004.....0004....,,,
006.....0005.....0004.....0004....,,,
.. ....

Danke

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo niko8380,

==> Jagged Arrays (natürlich nicht mit Arrays, sondern mit List<T>)

herbivore

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren

hallo herbivore.
Vielen Dank für deine super schnelle Antwort.
Könntest du aber bitte noch ein kleines bishen konkreter werden, wie ich das jetzt machen muss? List<T>?? Ich bin halt ein Anfänger und fast am verzweifeln

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo niko8380,

du suchst erstmal, was jagged Arrays sind und dann machst du das gleiche bloß mit List<T>. Was dem Array sein T[] ist dem der Liste sein List<T>.

herbivore

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren

hallo, da bi nich nochmal.

habe jetzt eine :
List<string> list = new List<string>();
list.Add(myString); //myString speichert die aktuell gelesene Zeile
foreach (string listEl in list)
{
Console.WriteLine(listEl);//testausgabe
}

herbivore´s Vorschlag war jetzt, wenn ich es richtig verstanden habe 😉 so etwas zu machen:
List<string>list = new List<string>();
list.Add(new List<string>());
Ich weiss nicht wie ich verzweigte List<T> durchlaufen kann und dynamisch mit Werten füllen kann. Bei den Arrays habe ich doch z.b. die T_[j]. also i,j indizes mit den ich genua ein Element ansprechen kann. Wie geht das bei List<>?
Bei meinen Daten beinhaltet nur die erste Zeile Elemente vom Typ String, alle weiteren Zeile sind eigentlich double , und so müssen sie auch in die DB gespeichert werden.
Wenn mir jemand ein wenig helfen kann evtl mit einem Beispiel, wäre schon ganz nett. Ich habe schon im inet gesucht, im Galileo.... und im Buch von Krause und Bünnign aber nichts hat bisher geholfen.

gruß
niko8380

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo niko8380,

string [] [] ist doch nichts anderes als ein ein Array, das String-Arrays enthält. Entsprechend wäre das List<List<String>>.

herbivore

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren

hallo herbivore,

ich verstehen die Theorie(einigermaßen) aber beim umsetzten hapert es gewaltig.
Kannst du mir, wenn dir das keine große Umstände macht, an einem Beispile aufzeigen wir du das machen würdest?Oder auch jemand anderes! ich einem anderem Thread habe ich zwar etwas gefunden was meiner bisherigen Vorgehensweise sehr ähnlich ist, aber am ende benutzt derjenige ein 2D array zu speichern der Daten.

Gruß
niko8380

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo niko8380,

benutzen tut man es wie jagged Arrays und dazu gibt es ja eigentlich genug Beispiele.

herbivore

S
1.047 Beiträge seit 2005
vor 17 Jahren

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

List<string> eintrag = new List<string>();
eintrag.Add("Hallo!");
liste.Add(eintrag);

eintrag = new List<string>();
eintrag.Add("Na");
eintrag.Add("wie");
eintrag.Add("gehts?");
liste.Add(eintrag);

foreach(List<string> element in liste) {
    foreach(string s in element) {
        Console.WriteLine("{0} ",s);
    }
    Console.WriteLine();
}

Sollte dann ausgeben

Hallo!
Na wie gehts?

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren

Vielen dank sheitman(für das Beispiel) und herbivore für die bsiherige antworten!
kann jemand über meine code schauen und mir evtl. sagen was ich anders machen kann bzw. muss, damit das funktioniert?!!!


        static void Main(string[] args)
        {
            FileStream stream = new FileStream("c:\\mdaten\\text2klein.txt", FileMode.Open);
            StreamReader objReader = new StreamReader(stream);
            string myString = "";
            string[] myStringArray;
            List<List<string>> liste = new List<List<string>>();
            //List<string> buffer = new List<string>();

            while ((myString = objReader.ReadLine()) != null)
            {

                //buffer.Add(myString);

                if (myString.Length > 1)
                {
                    myStringArray = myString.Trim().Split(new char[]{ ' ', '\n', '\t' }); //String wird gesplittet und jeder wert ein einem array gespeichert


                    List<string> innerListe = new List<string>();
                    for (int e = 0; e < liste.Count; e++)
                    {
                        
                            innerListe = new List<string>();
                        for (int i = 0; i < myStringArray.Length; i++)
                        {
                            
                                innerListe.Add(myStringArray[i]);

                        }
                        liste.Add(innerListe);
                    }
                }
            }
        }

    }
}

Gruß
niko8380

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo niko8380,

kannst du bitte erstmal schreiben, was nicht funktioniert?

herbivore

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren

hallo herbivore und an alle anderen,

z.B. for (int e = 0; e < liste.Count; e++), das "liste.count" scheint mir nicht optimal zu sein, den die schleife wird nicht durchlaufen, 😉 deshalb habe ich die Liste buffer als Hilfe dazugenommen aber das gefällt mir nicht.
Ist der Aufbau generell richtig für eine List<List<string>>???
Habe mich an das Beispiel von sheitman orientiert.

Gruß
niko8380

S
1.047 Beiträge seit 2005
vor 17 Jahren

das problem ebsteht wohl in dem codeabschnitt

List<string> innerListe = new List<string>();
for (int e = 0; e < liste.Count; e++) {
    innerListe = new List<string>();
    for (int i = 0; i < myStringArray.Length; i++) {
        innerListe.Add(myStringArray[i]);
    }
    liste.Add(innerListe);
}
for (int e = 0; e < liste.Count; e++) {

macht ja keinen sinn, da deine liste ja noch leer ist... diese äußere schleife kann imho komplett enfallen

übrig bleibt dann

innerListe = new List<string>();
for (int i = 0; i < myStringArray.Length; i++) {
    innerListe.Add(myStringArray[i]);
}
liste.Add(innerListe);

was funktionieren und ausreichen müßte

komplett würde das also so aussehen


static void Main(string[] args) {
    FileStream stream = new FileStream("c:\\mdaten\\text2klein.txt", FileMode.Open);
    StreamReader objReader = new StreamReader(stream);
    string myString = "";
    string[] myStringArray;
    List<List<string>> liste = new List<List<string>>();
    List<string> innerListe = null;

    while ((myString = objReader.ReadLine()) != null) {
        if (myString.Length > 1) { //SOLLTE DAS NICHT > 0 SEIN UND MIT TRIM()?
             //String wird gesplittet und jeder wert ein einem array gespeichert           
            myStringArray = myString.Trim().Split(new char[]{ ' ', '\n', '\t' });

            innerListe = new List<string>();
            for (int i = 0; i < myStringArray.Length; i++) {
                innerListe.Add(myStringArray[i]);
            }
            liste.Add(innerListe);
        }
    }
}

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren

Hallo.
ich habe jetzt eine 2D Liste, mit Elemente vom Typ <string>.
Außer der ersten Zeile(s.o) meiner Datei, in der die die Name der Spalten stehen,
sind die restlichen Werte eigentlich vom Typ <double>.Muss ich nicht die Werte irgendwie in double konvertieren damit ich sie so auch in der Datenbank speichern kann??Ich möchte später, mit diesen Werten aus der Datenbank arbeiten und ich brauche sie doch als double.
Soll ich meine "konstruktion" verändern, d.h. in List<double> usw. ändern oder kann ich irgendwie konvertieren?
Generell:
Soll ich einen DataSet benutzen um die Daten in in die DB zu speichern, was meint ihr?

Danke für eure Zeit und Geduld 😉

Gruß
Niko8380

S
1.047 Beiträge seit 2005
vor 17 Jahren

um von string nach double zu konvertieren kannst du

double d = Convert.ToDouble("2.3");

du kansnt statt nem dataset auch einfach mit datatable arbeiten 😉

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren
for (int i = 0; i < data.Length; i++)
                    {
                        data[i] = lines[i].Split(new char[] { ' ', '\n', '\t' }); //Array wird "gesplittet"

                    } 
for (int s = 1; s < data.Length; s++)
                    {
                        for (int z = 0; z < data[s].Length; z++)
                        {
				meineConnection.Open();
                                double c = Convert.ToDouble(data[s][z]);
                                SqlCommand meinCommand = new SqlCommand("INSERT INTO Messwert(MessWert) VALUES(c)", meineConnection);

			  meinCommand.ExecuteNonQuery();
			meine.Connection.Close();
			}
		}

ich bekomme dauernd folgende Fehlermeldung:
System.FormatException: Die Eingabezeichenfolge hat das falsche Format.
bei System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
bei System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) bei

Was mache ich da falsch??

S
1.047 Beiträge seit 2005
vor 17 Jahren

würd sagen schau dir mal mit dem debugger an wie die zeichenkette aussieht die er im ToDouble benutzen möchte...

ansonsten gibt es noch Convert.ToDouble(String, IFormatProvider)

der zweite parameter gibt dabei vor wie der string formatiert ist bzw. wie er mit der formatierung umgehen soll (, oder . als kommazeichen etc.) ... einfach mal in die hilfe schaun

N
niko8380 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren

hallo nochmal.
ich glaube ich habe ein mögliche Problemstelle gefunden und zwar hat meine eingelesen Datei, an manchen Stellen, leider, zwei Tabulatoren(\t) hintereinander und erst dann kommt ein neuer Wert. So steht dann an dieser Stelle in einem -data~~[z]- ein leerer string(denke ich) und diesen kann er dann nicht in einem double konvertieren.
ich splitte mein array u.a. bei einem '\t' aber wie sage ich ihm jetzt das er das "Zweite" ('\t') ignorieren soll??

**Hat sich ERLEDIGT: **Ich habe in meinem array den Parameter "StringSplitOptions.RemoveEmptyEntries;" eingefügt der die leeren Strings entfernt. sieht jetzt so aus:
data_ = lines_.Trim().Split(new char[] { ' ', '\n', '\t' }, StringSplitOptions.RemoveEmptyEntries);
Sorry aber bevor ich poste benutzte ich die Suche intensiv.

Gruß
niko8380