锯齿状阵列的通用打印

时间:2017-07-31 12:07:48

标签: c# generics jagged-arrays

我目前正在处理大量数组并出于调试目的,我编写了一个通用的Print()方法来打印不同类型的数组

static void Main()
{
    Print(new double[]{ 1, 2, 3 });

    // Output: [ 1, 2, 3 ]
}

static void Print<T>(T[] array)
{
    int size = array.Length;
    if (size == 0)
        return;

    string str = "[ ";

    for (int i = 0; i < size; i++)
    {
        str += array[i].ToString();

        if (i < size - 1)
            str += ", ";
    }

    str += " ]";

    Console.WriteLine(str);
}

到目前为止工作正常。然后我想打印一个数组数组,比如double[][],并尝试了以下内容:

static void Main()
{
    Print(new double[][]
    {
        new double[] { 1, 2 },
        new double[] { 3, 4 },
        new double[] { 5, 6 },
    });

    // Output: [ 1, 2 ]
    //         [ 3, 4 ]
    //         [ 5, 6 ]
}

static void Print<T>(T[] array)
{
    if (array.Length == 0)
        return;

    if (array[0].GetType().IsArray)
    {
        foreach (var element in array)
        {
            Print<T>(element);
        }
    }
    else
    {
        int size = array.Length;
        string str = "[ ";

        for (int i = 0; i < size; i++)
        {
            str += array[i].ToString();

            if (i < size - 1)
                str += ", ";
        }

        str += " ]";

        Console.WriteLine(str);
    }
}

我只是想检查array的元素是否也是数组,如果是,我会再次为element的{​​{1}}调用函数Print。但是array不起作用,因为Print(element)的类型为element而不是T,我不知道如何告诉编译器在这种情况下{{1}是一个数组。我需要做些什么来完成这项工作?

2 个答案:

答案 0 :(得分:1)

您应该提供Print方法的2次重载 - 您可以随意从2D版本调用1D版本:

static void Print<T>(T[][] array)
{
     Console.WriteLine("Print 2D Array");
}
static void Print<T>(T[] array)
{
     Console.WriteLine("Print 1D Array");
}

实例:http://rextester.com/LYBUN44476

答案 1 :(得分:1)

你可以使用动力学来做到这一点:

    void Main()
    {
        Print(new double[][]
        {
            new double[] { 1, 2 },
            new double[] { 3, 4 },
            new double[] { 5, 6 },
        });

        // Output: [ 1, 2 ]
        //         [ 3, 4 ]
        //         [ 5, 6 ]
    }

    static void Print(dynamic array)
    {
        if (array.Length == 0)
            return;

        if (array[0].GetType().IsArray)
        {
            foreach (var element in array)
            {
                Print(element);
            }
        }
        else
        {
            int size = array.Length;
            string str = "[ ";

            for (int i = 0; i < size; i++)
            {
                str += array[i].ToString();

                if (i < size - 1)
                    str += ", ";
            }

            str += " ]";

            Console.WriteLine(str);
        }
    }

如果您只想测试较小部分的代码 - 我建议使用LinqPad,你有AnyType.Dump()方法,你不能实现任何东西;)