Benutzer mit den meisten Antworten
Frage zu Generics und IEnumerable<T> bei einem Methoden-Parameter

Frage
-
Hallo
Ich hätte folgende Frage - dieses kleine Code-Beispiel ist mir soweit klar, und läuft:
...... { List<string> names = new List<string>(); names.Add("Max"); names.Add("Moritz"); names.Add("Anna"); PrintOut(names); } public static void PrintOut(IEnumerable<string> values) { foreach (string value in values) { Console.WriteLine( "PrintOut: {0}", value); } }
wenn ich jetzt aber zum Beispiel eine List<int>zahlenListe erstelle, und dann ebenfalls die PrintOut-Methode verwenden möchte, müsste ich mir eine zweite PrintOut( IEnumerable<int> .... ) erstellen.
Jetzt ist meine Frage ( und daran scheitere ich gerade ) -> wie kann ich nur einmal die PrintOut-Methode implementieren, und den Parameter als generischen <T> Parameter übergeben, und dann die foreach-Anweisung ausführen ??
Ich habe zuerst an einer generischen Klasse gebastelt, aber es nicht hinbekommen. Wenn ich gleich bei der Methode direkt den Parameter auf <T> ändere, komme ich auch nicht hin.
Kann mir dazu bitte jemand weiterhelfen ??
Danke schon mal & schönen Gruß
Michael
Antworten
-
public static void Main() { List<string> names = new List<string>(); names.Add("Max"); names.Add("Moritz"); names.Add("Anna"); PrintOut(names); } public static void PrintOut<T>(IEnumerable<T> values) { foreach (T value in values) { Console.WriteLine("PrintOut: {0}", value); } }
MVP Data Platform Development My blog- Als Antwort markiert Elmar BoyeEditor Freitag, 9. Juli 2010 19:19
-
Hallo Manfred,
Zunächst wäre ja Deine Methode im Prinzip sehr trivial über object oder T implementierbar.
Der Knackpunkt liegt dann daran, dass zum Beispiel eine Klasse wie in meinem Beispiel "Person"
vielleicht keine sinnvolle Überschreibung von ToString haben.
Dann könnte man diese Methode implementieren und ggf. sogar mit dem partial Keyword diese auch ohne Änderung der Original-Klasse erweitern. Also etwa so:private void Form1_Load(object sender, EventArgs e) { List<string> names = new List<string>(); names.Add("Max"); names.Add("Moritz"); names.Add("Anna"); PrintOut(names); List<int> zahlenListe = new List<int>(); zahlenListe.Add(1); zahlenListe.Add(2); zahlenListe.Add(3); PrintOut(zahlenListe); List<Person> personen = new List<Person>(); personen.Add(new Person() { Vorname = "Vorname1", Alter = 42 }); personen.Add(new Person() { Vorname = "Vorname2", Alter = 24 }); personen.Add(new Person() { Vorname = "Vorname3", Alter = 14 }); PrintOut(personen); } public static void PrintOut<T>(IEnumerable<T> values) { foreach (T value in values) { Console.WriteLine("PrintOut: {0}", value); } } class Person { public string Vorname { get; set; } public int Alter { get; set; } public override string ToString() { return Vorname + " (" + Alter + " Jahre)"; } }
Es gibt einige weitere mögliche Verfahren. Zunächst nur einmal dies, um mal zu schauen, ob das vielleicht schon Deinen Ansprüchen genügt.
ciao Frank- Als Antwort markiert Elmar BoyeEditor Freitag, 9. Juli 2010 19:19
Alle Antworten
-
public static void Main() { List<string> names = new List<string>(); names.Add("Max"); names.Add("Moritz"); names.Add("Anna"); PrintOut(names); } public static void PrintOut<T>(IEnumerable<T> values) { foreach (T value in values) { Console.WriteLine("PrintOut: {0}", value); } }
MVP Data Platform Development My blog- Als Antwort markiert Elmar BoyeEditor Freitag, 9. Juli 2010 19:19
-
Hallo Manfred,
Zunächst wäre ja Deine Methode im Prinzip sehr trivial über object oder T implementierbar.
Der Knackpunkt liegt dann daran, dass zum Beispiel eine Klasse wie in meinem Beispiel "Person"
vielleicht keine sinnvolle Überschreibung von ToString haben.
Dann könnte man diese Methode implementieren und ggf. sogar mit dem partial Keyword diese auch ohne Änderung der Original-Klasse erweitern. Also etwa so:private void Form1_Load(object sender, EventArgs e) { List<string> names = new List<string>(); names.Add("Max"); names.Add("Moritz"); names.Add("Anna"); PrintOut(names); List<int> zahlenListe = new List<int>(); zahlenListe.Add(1); zahlenListe.Add(2); zahlenListe.Add(3); PrintOut(zahlenListe); List<Person> personen = new List<Person>(); personen.Add(new Person() { Vorname = "Vorname1", Alter = 42 }); personen.Add(new Person() { Vorname = "Vorname2", Alter = 24 }); personen.Add(new Person() { Vorname = "Vorname3", Alter = 14 }); PrintOut(personen); } public static void PrintOut<T>(IEnumerable<T> values) { foreach (T value in values) { Console.WriteLine("PrintOut: {0}", value); } } class Person { public string Vorname { get; set; } public int Alter { get; set; } public override string ToString() { return Vorname + " (" + Alter + " Jahre)"; } }
Es gibt einige weitere mögliche Verfahren. Zunächst nur einmal dies, um mal zu schauen, ob das vielleicht schon Deinen Ansprüchen genügt.
ciao Frank- Als Antwort markiert Elmar BoyeEditor Freitag, 9. Juli 2010 19:19
-
Hallo
Ich danke Euch beiden für die Rückmeldungen - das hat mir sehr weitergeholfen.
Das Beispiel von Manfred hatte ich auch versucht auf diese Art und Weise zu implementieren - bekam aber immer einen Compiler-Error, weil ich nach dem PrintOut das "<T>" nicht hinzugeschrieben habe.
Das ist für mich noch ein wenig kompliziert, wo wird ein <T> geschrieben, und wo nicht................
Schönen Gruß
Michael