2011-02-03 1 views
2

Я пытаюсь выполнить пробел, но глубина массива не является постоянной. Я ищу чистый способ пройти через каждый объект в массиве. прямо сейчас у меня есть простой случай переключения, который может обрабатывать разные уровни, получая свой Ранг как int для случая.Перемещение через n-мерный Jagged Array

, но некоторое время массив составляет 2 уровня глубины, а иногда и 5 уровней глубины. я бы не хотел писать случай для каждого уровня глубины.

например, у меня есть имена объектов myObj, иногда это myObj [] или myObj [] [] или myObj [] [] [] [];

с использованием либо Еогеасп или IEnumerator только пройти первое измерение массива

+1

«myObj, несколько раз это myObj [] или myObj [] [] или myObj [] [] [] []". Знаете ли вы, что это неправильный синтаксис. Покажите нам фрагмент кода, где эти массивы отображаются или читаются. – Euphoric

ответ

0

Ваш ответ является рекурсия. Я не думаю, что это работает. Он будет работать, если у вас есть класс с дочерними коллекциями.

int main() 
{ 
    CheckObj(myObject, 0); 
} 

void CheckObj(object myObject, int level) 
{ 
    if(!(myObject is myObj[])) 
    { 
     foreach(myObj[] o in (myObj[][])myObject) 
     { 
      CheckObj(o, level + 1); 
     } 
    } 
    else 
    { 
     //do what you need to do with myObj[] 
    } 
} 
+0

Компиляция в моей голове не была бы ошибкой кастинга при попытке применить «myObject» к «myObj [] []», если это «myObj [] [] [] []»? – Chris

1

Что-то вроде этого?

static void Main(string[] args) 
    { 
     int[][][] x = new int[][][] 
     { 
      new int[][] 
      { 
       new int [] { 1, 2, 3, 4 }, 
       new int [] { 5, 6 }, 
       new int [] { 7 } 
      }, 
      new int[][] 
      { 
       new int [] { 8 }, 
       new int [] { 9, 10 }, 
       new int [] { 11, 12, 13, 14 } 
      } 
     }; 

     DeepEnumerateArray(x); 
     Console.ReadLine(); 
    } 

    static void DeepEnumerateArray(Array x) 
    { 
     if (x.Length == 0) 
      return; 

     object first = x.GetValue(0); 
     if (first is Array) 
     { 
      foreach (Array y in x) 
       DeepEnumerateArray(y); 
     } 
     else 
     { 
      foreach (object z in x) 
       Console.WriteLine(z); 
     } 
    } 
2

Это должно быть сделано. , ,

private static void EnumerateObjects(Array items) 
{ 
    foreach (var item in items) 
    { 
     if (item is Array) 
     { 
      EnumerateObjects((Array)item); 
     } 
     else if (item is MyObject) 
     { 
      Console.WriteLine(item); 
     } 
    } 
} 
4

Вот метод расширения для обхода зазубренные/многомерные массивы (аналогичные Дэвид Б. один, но с выходом, нулевой обработки и литья типа): Пример

public static class Extensions 
{ 
    public static IEnumerable<T> Traverse<T>(this Array array) 
    { 
     foreach (object val in array) 
     { 
      if (val == null) 
       continue; //null means empty sub-array --> skip it 
      if (val is Array) 
      { 
       var subArray = (Array)val; 
       foreach (var value in subArray.Traverse<T>()) 
        yield return value; 
      } 
      else 
      { 
       yield return (T)val; 
      } 
     } 
    } 
} 

Использование:

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[][][] jagged = new int[4][][]; 

     jagged[0] = new int[2][] { new[] { 0, 1 }, new[] { 2, 3, 4 } }; 
     jagged[1] = new int[3][] { new[] { 5, 6, 7 }, new[] { 8, 9, 10 }, new[] { 11, 12 } }; 
     jagged[3] = new int[4][] { new[] { 13, 14 }, null, new[] { 15, }, new[] { 16 } }; 

     var jaggedElements = jagged.Traverse<int>().ToList(); 
     // contains: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 

     int[, ,] multi = new[, ,] { { { 1, 2 }, { 3, 4 } }, 
         { { 4, 5 }, { 6, 7 } }, 
         { { 8, 9 }, { 10, 11 } } }; 


     var multiElements = multi.Traverse<int>().ToList(); 
     // contains: 1,2,3,4,5,6,7,8,9,10,11 

    } 
} 
+1

Почему у вас есть «выход из строя», в конце метода? Это совершенно не нужно. – svick

+0

@svick: вы правы, избыточно, удалены :) – digEmAll

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

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