Ich möchte eine Funktion, die ich als Alternative zu .ToString() aufrufen kann, die den Inhalt von Sammlungen anzeigen wird.Wie konvertiere ich IEnumerable <T> in String, rekursiv?
Ich habe dies versucht:
public static string dump(Object o) {
if (o == null) return "null";
return o.ToString();
}
public static string dump<K, V>(KeyValuePair<K, V> kv) {
return dump(kv.Key) + "=>" + dump(kv.Value);
}
public static string dump<T>(IEnumerable<T> list) {
StringBuilder result = new StringBuilder("{");
foreach(T t in list) {
result.Append(dump(t));
result.Append(", ");
}
result.Append("}");
return result.ToString();
}
aber die zweite Überlast wird nie genannt. Zum Beispiel:
List<string> list = new List<string>();
list.Add("polo");
Dictionary<int, List<string>> dict;
dict.Add(1, list);
Console.WriteLine(dump(dict));
Ich erwarte diese Ausgabe:
{1=>{"polo", }, }
Was passiert eigentlich, ist dies: dict korrekt als IEnumerable<KeyValuePair<int, List<string>>>
interpretiert wird, so wird die dritte Überlastung bezeichnet.
Die 3. Überladung ruft Dump auf einem KeyValuePair> auf. Dies sollte (?) Die zweite Überladung aufrufen, aber es tut dies nicht - es ruft stattdessen die erste Überladung auf.
So bekommen wir diese Ausgabe:
{[1=>System.Collections.Generic.List`1[System.String]], }
, die von KeyValuePair der .ToString() Methode erstellt wird.
Warum wird die zweite Überlast nicht aufgerufen? Es scheint mir, dass die Laufzeit alle Informationen haben sollte, die benötigt werden, um eine KeyValuePair mit vollständigen generischen Argumenten zu identifizieren und diese aufzurufen.
kein Duplikat, aber von möglichem Interesse: http://stackoverflow.com/questions/6032908/is-there-a-library -that-a-formatiert-dump-function-like-linqpad – TrueWill
Wahrscheinlich hat mit 'KeyValuePair' zu tun, eine Struktur anstelle einer Klasse. –
Ist nicht das Problem eher, dass die dritte Überladung nicht für die "Liste" aufgerufen wird? Sie erhalten die Ausgabe von der zweiten Überladung, aber wenn es das Paar abgibt, verwendet es die erste anstelle der dritten Überladung. Können Sie versuchen, nur 'dump (list)' zu schreiben? Außerdem: Haben Sie Fehler gemacht, um genau zu überprüfen, welche Entscheidungen getroffen wurden? Geh durch den Code und werde weiser! =) –