2017-07-31 32 views
3

我目前有很多阵列的工作和调试目的一般印刷我写了一个通用的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元素又是数组,如果是这样,我再次调用该函数打印的每个elementarray。但Print(element)不起作用,因为element是类型T而不是T[],我不知道如何告诉编译器,在这种情况下,T是一个数组。我需要做些什么来完成这项工作?

+0

一个可能很重要的一点 - 你所谓的阵列数组实际上被称为锯齿阵列。 C#支持('double [] []'和'double [,]')。你需要支持两者还是你真的只处理数组数组(锯齿形数组)。在这里看到更多的信息:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/jagged-arrays – Jamiec

+0

我需要参差不齐的数组,因为我在与Accord.Net周围玩,他们的SVM的。他们的方法大部分都是以锯齿状数组为参数。 –

回答

1

你应该提供2个重载你Print方法 - 只要你想,你可以自由地从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

+0

虽然这当然可以解决这个问题,但它不像递归执行此操作的单一方法那样优雅。有没有更好的办法? – Neil

+0

@尼尔 - 这是一个意见问题,海事组织这是*更优雅,因为2D版本只是通过调用1D版本循环。简单,明确,类型安全。任务完成! – Jamiec

+0

是的,但那样我每次向维度添加维度时都必须写入额外的重载。有没有办法在数组中迭代任意数量的维度?那就是我试图用递归调用自己来构建这个方法的原因。 –

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()方法和你不能实现任何东西;)

+0

很酷,我不知道动态。是否有任何主要缺点,因为有关动态的任何操作都将在运行时解决?我可以想象,如果使用太频繁,这可能很容易成为错误和崩溃的根源? –

+0

有非常好的SOF问题:) https://stackoverflow.com/questions/7478387/how-does-having-a-dynamic-variable-affect-performance – Piotr

+0

现在没有太多的使用通用参数 - 但很好的答案! – Jamiec