Chcę funkcji, które można wywołać jako alternatywę dla .ToString(), który pokaże zawartość kolekcji.Jak przekonwertować IEnumerable <T> na ciąg, rekursywnie?
Próbowałem to:
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();
}
ale drugi przeciążenie nigdy nie jest wywoływana. Na przykład:
List<string> list = new List<string>();
list.Add("polo");
Dictionary<int, List<string>> dict;
dict.Add(1, list);
Console.WriteLine(dump(dict));
Czekam tego wyjścia:
{1=>{"polo", }, }
Co właściwie się dzieje, to: dict jest poprawnie interpretowana jako IEnumerable<KeyValuePair<int, List<string>>>
, więc 3rd przeciążenie jest tzw.
3rd połączenia przeciążeniowe zrzucić na KeyValuePair>. Powinno to (?) Wywołać drugie przeciążenie, ale nie powoduje - zamiast tego wywołuje pierwsze przeciążenie.
więc uzyskać ten wynik: metodę
{[1=>System.Collections.Generic.List`1[System.String]], }
który jest zbudowany z KeyValuePair za .ToString().
Dlaczego drugie przeciążenie nie jest wywoływane? Wydaje mi się, że środowisko wykonawcze powinno mieć wszystkie informacje potrzebne do zidentyfikowania KeyValuePair z pełnymi argumentami ogólnymi i wywołać to.
nie jest to duplikat, ale możliwego zainteresowania: http://stackoverflow.com/questions/6032908/is-there-a-library -to-zapewnia-formatowaną-funkcję-zrzutu-linqpad – TrueWill
Prawdopodobnie ma to związek z 'KeyValuePair' będącym strukturą zamiast klasą. –
Czy to nie problem, że trzecie przeciążenie nie jest wywoływane dla 'Listy'? Otrzymujesz wyjście z drugiego przeciążenia, ale kiedy zrzuca parę, używa pierwszego zamiast trzeciego przeciążenia. Czy możesz spróbować wypisać właśnie 'dump (list)'? Ponadto: Czy debugujesz, aby dokładnie sprawdzić, jakie decyzje są podejmowane? Przejdź przez kod i bądź mądrzejszy! =) –