2015-01-01 2 views
1

Я пытаюсь проверить, какой массив представляет собой объект: 1D, 2D или массив массивов/массивов с зазубринами.Как проверить, является ли объект массивом массивов/ячеистых массивов

Вот что я пробовал:

if (o is Array && ((Array)o).Rank == 2) { 
     Console.Write ("2D-Array: "); 
    } 
    /* else if (o[0] is Array) { 
     Console.WriteLine ("Jagged Array: "); 
    } */ 
    else if (o is Array) { 
     Console.Write ("1D-Array: "); 
    } 

Но средний тест не работает, потому что Cannot apply indexing with [] to an expression of type 'object'

Как еще можно это сделать? Заранее спасибо.

+2

Вы можете использовать [ПолучитьЗначение] (http://msdn.microsoft.com/library/system.array .getvalue.aspx). Но этот «новый объект [] {новый объект [0], 3}« зубчатый массив? – PetSerAl

ответ

1

С o является object, и вы не ввели его в качестве массива, этот код не будет компилироваться. Вот простой способ:

var arr = o as Array; 
if(arr != null) 
{ 
    if(arr.Rank == 2) 
    { 
     Console.Write ("2D-Array: "); 
    } 
    else if (arr.Length > 0 && arr.GetValue(0) is Array) 
    { 
     Console.WriteLine ("Jagged Array: "); 
    } 
    else 
    { 
     Console.Write ("1D-Array: "); 
    } 
} 
+0

Вы также не можете индексировать 'Array'. – PetSerAl

+0

@PetSerAl Правильно, я видел, что 'Array' реализует' IList', но я не удостоверился, что реализация не была явной. Исправлена. –

0

Ниже простой кусок кода, который представляет собой рабочая версию, чтобы различать разные массивы, в основном между одномерными массивами с помощью GetType, а затем сравнивая его с помощью TypeOf для данного типа. Я уверен, что реализация может быть дополнительно оптимизирована, но этот пример дает сущность дифференциации между одномерными массивами, включая массив с зазубринами. Для Многомерные массивы ранга является достаточно хорошим

 int[,] twoDimensionalArr = new int[1,1]; 

     twoDimensionalArr[0,0] = 5; 

     Console.WriteLine("2D Array Rank :: " + twoDimensionalArr.Rank); 

     int[][] jaggedArray = new int[1][]; 

     jaggedArray[0] = new int[1]; 
     jaggedArray[0][0] = 1; 

     Console.WriteLine("Jagged Array Rank :: " + jaggedArray.Rank); 


     if (jaggedArray[0].GetType() == typeof(int[])) 
      Console.WriteLine("Jagged Array - Success"); 
     else 
      Console.WriteLine("Jagged Array - Failure"); 

     int[] oneDimensionalArray = new int[1]; 

     oneDimensionalArray[0] = 3; 

     if (oneDimensionalArray[0].GetType() != typeof(int[])) 
      Console.WriteLine("One Dimensional Array - Success"); 
     else 
      Console.WriteLine("One Dimensional Array - Failure"); 

выполнение кода Результат:

2D Array Rank :: 2 
Jagged Array Rank :: 1 
Jagged Array - Success 
One Dimensional Array - Success 

 Смежные вопросы

  • Нет связанных вопросов^_^