C# String-Eigenschaften aller myobject aus einer list<myobject> auslesen (ohne LinQ)

User7634

Cadet 4th Year
Registriert
Aug. 2012
Beiträge
109
Hallo,
ich sitze an einem Anfänger-Projekt und komme nicht weiter:

Ich habe zwei Klassen: KSammlung und KDetail

KDetail enthält u.a ein privates Feld vom Typ string namens ‚text‘, das über die Eigenschaft ‚Text‘ angesprochen werden kann (mit getter und setter)

KSammlung enthält u.a. ein privates Feld vom Typ list<KDetail> namens ‚details‘, das ebenfalls als Eigenschaft ‚Details‘ von außen erreichbar ist.

ks1 sei Objekt vom Typ KSammlung
ks1.Details enthält verschiedene Objekte vom Typ KDetail.

Ich möchte jetzt von allen in der Liste enthaltenen Objekten die Eigenschaft Text (ggf. durch Kommata abgetrennt) in einer Textbox darstellen.

Wie kann ich – zB in einer Schleife – auf alle string Eigenschaften der gesamten Liste zugreifen ?

Bei stackoverflow habe ich nur Lösungen mit LinQ gefunden. Geht das auch ohne ?

Vielen Dank und Gruß
user7634
 
Du läufst mit einer foreach-Schleife über "ks1.Details". Darin hast du nacheinander Zugriff auf jedes "KDetail"-Objekt in der Liste. Den Inhalt der "Text"-Eigenschaft kannst du dann direkt in eine TextBox oder einen außerhalb der Schleife definierten String schreiben.

Code gibt's von mir keinen, aber das sollten genug Stichworte zu ausprogrammieren sein. :)

PS: Steht das "K" für Klasse? Falls ja, solltest du dir das abgewöhnen, da solche Prefixe einerseits mittlerweile ungewöhnlich und auch unnötig ist.
 
Zuletzt bearbeitet:
Danke, das versuche ich mal.
Ja, hier steht das K für Klasse, aber nur um es hier im Forum zur verdeutlichen. Im Code habe ich das nicht, sondern versuche da, mich an die üblichen Konventionen zu halten. Gibt viel zu lernen anfangs ;)
 
Ich mache es mal einfach aus de Kopf, d.h. ohne Garantie ;)

Code:
 Stringbuilder sb = new Stringbuilder();
//alternativ foreach (KDetail detail in ks1.Details){
foreach (var detail in ks1.Details){
    sb.Append(detail.Text);
    sv.Append(',');
}
//letztes Komma abschneiden
sb.Length--;

string alleEigenschaften = sb.ToString();
 
Ohne LINQ kannst du z.B. folgendes machen:

Code:
KSammlung sammlung = new KSammlung()
{
    Details = new List<KDetail>()
    {
        new KDetail() { Text = "Text 1" },
        new KDetail() { Text = "Text 2" },
        new KDetail() { Text = "Text 3" },
        new KDetail() { Text = "Text 4" }
    }
};

string ergebnis = String.Join(",", sammlung.Details.ConvertAll(d => d.Text));

EDIT: d.Name heißt natürlich d.Text
 
Zuletzt bearbeitet: (Bezeichner geändert)
prima, zwei Lösungen. Habe ich beide ausprobiert und funktionieren auch beide, vielen Dank. Die Lösung von Ephesus kann ich auch nachvollziehen, diejenige von Physikbuddha ist ja wesentlich schlanker, ich verstehe sie aber - offen gestanden - nicht ganz. Welches Konzept steht hinter dem (Teil-)Ausdruck

ConvertAll(d => d.Name)​

Gibt es zwischen beiden Lösungen Performanceunterschiede ?
 
Statt wie @Ephesus einen StringBuilder zu nehmen, habe ich gleich die String.Join-Funktion benutzt, die sich automatisch um die Trennzeichen kümmert und auch das am Schluss gleich weglässt.
Allerdings nimmt String.Join nur direkt eine List<string> entgegen, mit einer List<KDetails> kann sie nichts anfangen, da sie nicht weiß, was sie verbinden soll.
Daher verwende ich ConvertAll, um die Details-Liste zu einer String-Liste zu konvertieren.
Wenn du dich mit Lambda-Ausdrücken noch nicht auskennst, lies den Ausdruck d => d.Text einfach als "Nimm jedes einzelne Element der Liste, bezeichne es als d, und gib in die konvertierte Liste die Eigenschaft d.Text zurück." Den Namen d kannst du beliebig vergeben.

Vergleichbar mit:
Code:
List<string> konvertierteListe = new List<string>();
foreach (KDetails d in sammlung.Details)
{
    konvertierteListe.Add(d.Text);
}

Eigentlich dasselbe Verfahren wie bei LINQ, da hätte ich statt sammlung.Details.ConvertAll(d => d.Text) einfach sammlung.Details.Select(d => d.Text) genommen. Sieht gleich aus, aber ersteres gehört zur List<string>, zweiteres zu den LINQ-Erweiterungen.

Bezüglich Performance habe ich mal ein paar Tests laufen lassen mit unterschiedlichen Ergebnissen.
Ich habe eine KSammlung mit unterschiedlicher Anzahl an KDetails in der Liste erstellt (Text mit Random.Next() gebildet) und beide Lösungen verglichen:

100.000 KDetails
Ephesus - 5 ms
Physikbuddha 6 ms

500.000 KDetails
Ephesus - 46 ms
Physikbuddha 57 ms

1.000.000 KDetails
Ephesus - 99 ms
Physikbuddha 106 ms

2.000.000 KDetails
Ephesus - 193 ms
Physikbuddha 172 ms

3.000.000 KDetails
Ephesus - 185 ms
Physikbuddha 334 ms

Ich glaube, dass hier viel Compiler- und Ausführungsoptimierung am Werk ist.
Wenn du mich fragst, sind die Performanceunterschiede für dich unerheblich, es sei denn, du gehst auch in die Millionen.
 
Zuletzt bearbeitet:
Wov, vielen Dank. Lambda-Ausdrücke werde ich mir mal anschauen. Ist ja wirklich eine sehr knappe Art und Weise, etwas auszudrücken. Und die Tests sind insoweit für mich aufschlussreich, als es wohl tatsächlich nicht drauf ankommen dürfte; interessant finde ich die Werte (ms) bei 2Mio und 3Mio KDetails, einmal gehen sie rauf, beim anderen verdoppeln sie sich fast.
Nochmals: danke, das hat mir sehr weitergeholfen. Grüße aus dem hohen Norden.
 
Zurück
Oben