Entwickler-Ecke
Basistechnologien - Mehrdimensionales Array durchsuchen?
avoid - Mo 16.07.12 11:24
Titel: Mehrdimensionales Array durchsuchen?
ich habe eine ArrayList mit zwei Dimensionen.
die arraylist ist mit "public string[,] users;" definiert
und wird mit "users = new string[zeilen.Count, 3];" initialisiert.
nach dem füllen mit daten versuche ich nun mit folgendem code
das array nach einem namen zu durchsuchen
um mir dann den rest der dazugehörigen daten ab rufen zu können.
C#-Quelltext
1:
| users.IndexOf(listBoxBenutzer.SelectedItems[0].ToString()); |
frage1: warum klappt das so nicht?
frage2: wie könnte es klappen?
gruß,avoid
---nachtrag---
titel wurde geändert.
Th69 - Mo 16.07.12 11:40
Hallo,
was benutzt du denn nun genau: eine
ArrayList [
http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx] oder ein mehrdimensionales Array?
Die
ArrayList ist aber schon seit .NET 2.0 obsolet (veraltet) und sollte durch eine
List<T> ersetzt werden.
Ich verstehe auch nicht, wieso du ein mehrdimensionales Array hier benötigst.
Normalerweise würde man eine Klasse
User anlegen und diese dann in eine Liste packen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| class User { public Name { get; set; } public Forename { get; set; } public DateTime Birthday { get; set; } }
List<User> users = new List<User>;
User user = new User { Name = "Smith", Forname = "John", DateTime = new DateTime(1969, 1, 1) }; users.Add(user); |
avoid - Mo 16.07.12 13:03
hm, :roll:
da hab ich wohl die code zeilen durcheinander gebracht.
du hast recht, es geht hier nur um das array mit zwei dimensionen in dem ich einen namen suchen will.
das erklärt auch warum indexof nicht will. :D
mit der arraylist hab ich weiter oben im code nur was eingelesen.
p.s. ich finde die arraylist um ecken praktischer um ein array zu erstellen dessen größe erst am ende bekannt ist,
als erst ein klasse zusammen zu friemeln die ich dann nur ein mal brauche.
ich hab es jetzt so hin bekommen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for (int i = 0; i <= users.GetUpperBound(0); i++) { if (listBoxBenutzer.SelectedItems[0].ToString() == users[i, 0]) { textBoxName.Text = listBoxBenutzer.SelectedItems[0].ToString(); textBoxKennwort.Text = users[i, 1]; numericUpDown1.Value = Convert.ToInt32(users[i, 2]); } } |
is wohl etwas billig umgesetzt und geht sicher besser aber es läuft erst mal.
Christian S. - Mo 16.07.12 13:26
avoid hat folgendes geschrieben : |
p.s. ich finde die arraylist um ecken praktischer um ein array zu erstellen dessen größe erst am ende bekannt ist,
als erst ein klasse zusammen zu friemeln die ich dann nur ein mal brauche. |
List<T> ist im Framework eingebaut, da muss man nichts friemeln ;-) Sie ist außerdem typensicher und IIRC auch schneller als eine ArrayList.
jfheins - Mo 16.07.12 13:37
Zudem kannst du auf diese Weise die (undokumentierte) Zuordnung
[,0] ==> Name
[,1] ==> Kennwort
[,2] ==> Ja was eigentlich?
dokumentieren und Fehler besser erkennen.
C#-Quelltext
1: 2: 3: 4:
| textBoxKennwort.Text = users[i, 2]; textBoxKennwort.Text = users[i].Name; |
Also am besten die Array (fast) vergessen und stattdessen generische Listen hernehmen :wink:
Und so eine kleine Hilfsklasse mit 6 Zeilen kann man sich schon gönnen.
P.S.: Wenn du absolut keine Lust auf Klassen hast, kannst du auch einen struct nehmen.
Der geht genau so gut in die List<T> rein wie eine Klasse, ist aber auf keinen Fall zu empfehlen!
(Aber lieber structs in einer Liste als ein Array :P )
Edit: Die Sache mit den Structs klargestellt.
Ralf Jansen - Mo 16.07.12 13:40
| Zitat: |
| P.S.: Du kannst auch einen struct nehmen, der geht genau so gut in die List<T> rein wie eine Klasse. |
Hier, mit der von TH69 gezeigten Userklasse, sicher keine gute Idee.
avoid - Mo 16.07.12 14:22
ich muß zugeben das ich schon über sowas wie generische Listen gelesen und nachgedacht hatte.
noch hab ich aber davon keinen plan auch wenn ich mit "List" vor einem jahr schon mal was gemacht hab.
da muß ich mich wohl mal etwas einlesen.
um speicherbelegung oder geschwindigkeit gehts mir nicht, warum soll ich sparsamer programmieren als die großen konzerne. ;)
dank euch auf jeden fall.
Palladin007 - Mo 16.07.12 18:03
Och, List ist ganz einfach. ^^
C#-Quelltext
1: 2:
| List<Datentyp> VariablenName = new List<Datentyp>(); VariablenName.Add(new Datentyp()); |
Mal so als kleines Beispiel.
Dann gibt es noch die Eigenschaft
Count und die Methode
Remove um mal die wichtigsten zu nennen.
Die Klasse ist generisch, merk dir das bis dann, wenn du das lernst, denn damit kannst du dann auch die ganzen anderen Dinge verstehen.
Aber so ist das ein ganz einfaches System.
Wenn du mehrere Dimensionen willst, dann setzt du als Datentyp einfach wieder eine Liste.
Und ja, eine Klasse für eine Stelle zu bauen nervt, ist aber tatsächlich später sinnvoller.
Wenn du das nicht willst (auf keinen Fall struct), dann kannst du auch einen anonymen Typ nehmen.
Das macht aber nur Sinn, wenn du das wirklich nur einmal z.B. in einer Methode brauchst. Sieht dann so aus:
C#-Quelltext
1:
| var Person = new { Name = "Hans", Alter = 5 }; |
Du kannst dann später über die Variable Person Name und Alter wie eine normale Eigenschaft abrufen.
Ich persönlich habe es aber noch nie gebraucht^^
In deinem Fall ist eine Klasse aber wirklich sinnvoller, da, wie ich vermute, sich dein ganzes Programm um irgend eine Auflistung von Personen dreht, die dann verarbeitet werden soll. Und es erleichtert die Arbeit damit sehr.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!