Entwickler-Ecke

Basistechnologien - Zugriff auf einer Spalte bei einer Klasse oder List<> Konv.?


alegria - Mi 15.07.09 09:39
Titel: Zugriff auf einer Spalte bei einer Klasse oder List<> Konv.?
Also ich hab ne Klasse Country:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class Country
        {
            public string Land { get; set; }
            public string Hauptstadt { get; set; }
            
            public Countries(string Land, string Hauptstadt)
            {
                this.Land = Land;
                this.Hauptstadt = Hauptstadt;
            }
        }

und will nun alle Hauptstädte zu einer Textbox als AutoCompleteCustomSource hinzufügen. Ich helfe mir indem ich ein List<string> erstelle und alle Hauptstädte einlese um dann entsprechend zuzuordnen. Also so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// bereits für vielerlei andere Zwecke angelegt/vorhanden
List<Countries> countries = new List<Countries>();
countries.Add(new Countries("Deutschland""Berlin"));
countries.Add(new Countries("Frankreich""Paris"));
...
// hier jetzt das eigentlich interessante
List<String> test = new List<String>();
            foreach (Countries xxx in countries){
                test.Add(xxx.Hauptstadt);
            }
            textbox.AutoCompleteCustomSource.AddRange(test.ToArray());

Aber kann ich das nicht irgendwie direkter machen? Die List countries ist ja schon da. Ich müsste jetzt nur irgendwie die konkrete Spalte benennen und vielleicht das dann noch automatisch mit ToList() in ne Liste umwandeln und könnte es so letzlich wie mit meiner test Liste dann mittels ToArray() der textbox zuordnen...

Geht sowas? Ideen? Hinweise?

Danke im Voraus...


JüTho - Mi 15.07.09 09:57

Nein, ich glaube nicht, dass es etwas Einfacheres oder Schnelleres gibt. Das Problem ist, dass du eine List<T> hast und für jedes Element (Item) den Wert einer bestimmten Eigenschaft abfragen willst. Eine solche Möglichkeit, eine Spalte zu extrahieren, gibt es meines Wissens in keiner Collection.

Du könntest lediglich eine solche Methode allgemein definieren (vielleicht als Extension-Methode), der du eine beliebige List<T> mit dem Namen und Typ U einer Eigenschaft übergibst und eine List<U> zurückbekommst. Aber das lohnt sich nur, wenn man das häufiger benötigt.

In deinem Fall kannst du den Umweg über List<string> sparen und direkt in ein String-Array kopieren, weil du durch countries die Anzahl der Strings bereits kennst:

C#-Quelltext
1:
2:
3:
4:
5:
6:
string[] test = new string[countries.Count];
for(int x1 = 0; x1 < countries.Count, x1++)
{
   test[x1] = countries[x1].Hauptstadt;
}
textbox.AutoCompleteCustomSource.AddRange(test);


Gruß Jürgen


Christian S. - Mi 15.07.09 09:58

Hallo!

Da Du als Framework-Version 3.5 angegeben hast, dürfte das mit LINQ ganz einfach gehen:


C#-Quelltext
1:
textbox.AutoCompleteCustomSource.AddRange(countries.Select(c => c.Hauptstadt).ToArray());                    


Grüße
Christian


alegria - Mi 15.07.09 10:34

Sehr schön! :)

Vielen Dank...