Довольно печатать коллекцию рекурсивно - PullRequest
3 голосов
/ 17 апреля 2019

Я видел много вопросов по этому поводу, но я не видел ни одного о том, чтобы делать это рекурсивно.Я создал несколько методов расширения, которые довольно хорошо справляются с печатью на глубине 1. Это выглядит так:

    public static string PrettyToString<K, V>(this Dictionary<K, V> dictionary)
    {
        string result = "{";
        foreach (var kvp in dictionary)
        {
            result += $"({kvp.Key}, {kvp.Value}) ";
        }
        result += "}";
        return result;
    }

    public static string PrettyToString<T>(this List<T> list)
    {
        string result = "{";
        foreach (var element in list)
        {
            result += $"{element}, ";
        }
        result += "}";
        return result;
    }

    public static string PrettyToString<T>(this T [] list)
    {
        string result = "{";
        foreach (var element in list)
        {
            result += $"{element}, ";
        }
        result += "}";
        return result;
    }

Но что, если K, V или T это другая коллекция, как List или Dictionary?Я хочу сделать рекурсивно красивую печать, но я не уверен, как это сделать.В результате мой вывод выглядит следующим образом:

{(foo, System.Collections.Generic.Dictionary`2[System.String,System.Boolean])...

Я хочу, чтобы он выглядел следующим образом:

    {(foo, {(bar, true)})...

Я ищу методы, которые печатаются рекурсивно, независимо от вложенноготипы:

var x = new List<Dictionary<string, string>>();
var y = new Dictionary<Dictionary<string, string>, string>>();
var z = new Dictionary<Dictionary<string, string>, List<string>>>();
...
x.PrettyToString();
y.PrettyToString();
z.PrettyToString();

Должны ли все рекурсивно распечатывать содержимое.Как мне этого добиться?

1 Ответ

1 голос
/ 17 апреля 2019

Я изменил подпись ваших методов и сделал их неуниверсальными.

Хитрость заключается в том, чтобы определить тип перед преобразованием.

Посмотрите на пример кода ниже.Надеюсь, это поможет.

Пожалуйста, посмотрите на класс Ext внизу исходного кода.

Попробуйте онлайн

using System;
using System.Collections;
using System.Collections.Generic;

namespace ConsoleApp8
{
    class Program
    {
        static void Main(string[] args)
        {
            var Dic = new Dictionary<int, string> { { 1, "Ali" }, { 2, "B" } };
            Console.WriteLine(Dic.PrettyToString());

            var Dic1 = new Dictionary<string, float> { { "Ali", 12.5f }, { "B", 99.9f } };
            Console.WriteLine(Dic1.PrettyToString());

            var Dic2 = new Dictionary<List<int>, string>
            {
                { new List<int> { 1, 2, 3 }, "A" },
                { new List<int> { 4, 5, 6 }, "B" }
            };
            Console.WriteLine(Dic2.PrettyToString());

            var Dic3 = new Dictionary<Dictionary<string, string>, string>
            {
                { new Dictionary<string, string> { { "a", "A" }, { "b", "B" } }, "Capital" },
                { new Dictionary<string, string> { { "1", "1" }, { "2", "4" }, { "4", "16" } }, "Power" }
            };
            Console.WriteLine(Dic3.PrettyToString());

            var Dic4 = new Dictionary<Dictionary<string, string>, List<string>>
            {
                { new Dictionary<string, string> { { "a", "A" }, { "b", "B" } }, new List<string> { "A", "B" } },
                { new Dictionary<string, string> { { "1", "1" }, { "2", "4" }, { "4", "16" } }, new List<string> { "1", "2", "4" } }
            };
            Console.WriteLine(Dic4.PrettyToString());

            var L = new List<List<int>>
            {
                new List<int> { 1, 2, 3 },
                new List<int> { 4, 5, 6 }
            };
            Console.WriteLine(L.PrettyToString());

            Console.ReadKey();
        }
    }

    static class Ext
    {
        public static string PrettyToString(this IDictionary dictionary)
        {
            string result = "{";
            foreach (var Key in dictionary.Keys)
            {
                result += string.Format("({0}, {1}) ", PrettyToString(Key), PrettyToString(dictionary[Key]));
            }
            result += "}";
            return result;
        }

        public static string PrettyToString(this IEnumerable list)
        {
            string result = "{";
            foreach (var element in list)
            {
                result += string.Format("{0}, ", PrettyToString(element));
            }
            result += "}";
            return result;
        }

        private static string PrettyToString(object O)
        {
            var S = O as string;
            if (S != null) return S;

            var D = O as IDictionary;
            if (D != null) return D.PrettyToString();

            var L = O as IEnumerable;
            if (L != null) return L.PrettyToString();

            return O.ToString();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...