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>;

// dies dann z.B. in eine Schleife packen
User user = new User { Name = "Smith", Forname = "John", DateTime = new DateTime(196911) };
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

user profile iconavoid hat folgendes geschrieben Zum zitierten Posting springen:
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:
// Sieht eigentlich gut aus
textBoxKennwort.Text = users[i, 2];
// Sieht nach einem Fehler aus
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.