锯齿状阵列的通用打印
Generic printing of 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
的元素是否为数组,如果是,我为 array
的每个 element
再次调用函数 Print。但是 Print(element)
不起作用,因为 element
是 T
类型而不是 T[]
并且我不知道如何告诉编译器在这种情况下 T
是一个数组。我需要做什么才能使这项工作正常进行?
您应该提供 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");
}
你可以使用动态来做到这一点:
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);
}
}
如果您只想测试一小部分代码 - 我建议您在具有 AnyType.Dump() 方法的地方使用 LinqPad,并且您不能实现任何东西 ;)
我目前正在处理大量数组,出于调试目的,我编写了一个通用的 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
的元素是否为数组,如果是,我为 array
的每个 element
再次调用函数 Print。但是 Print(element)
不起作用,因为 element
是 T
类型而不是 T[]
并且我不知道如何告诉编译器在这种情况下 T
是一个数组。我需要做什么才能使这项工作正常进行?
您应该提供 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");
}
你可以使用动态来做到这一点:
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);
}
}
如果您只想测试一小部分代码 - 我建议您在具有 AnyType.Dump() 方法的地方使用 LinqPad,并且您不能实现任何东西 ;)