Преобразовать объект, который является массивом, в массив объектов - PullRequest
1 голос
/ 15 февраля 2011

Как (в C #) преобразовать объект, являющийся массивом, в массив объектов

Что-то в следующем формате:

bool Compare(object valueToCompare)
{
   if(valueToCompare.IsArray())
   {
      foreach(var value in (valueToCompare as Array)){
          if(Compare(value));
             return true;
          return Compare(value);
      }
   }
   else
       return Compare(valueToCompare);
}

ПРИМЕЧАНИЕ: Код выше мало что дает. Я просто создаю прототипы.

1 Ответ

3 голосов
/ 15 февраля 2011

Предполагая, что верно следующее:

  • valueToCompare - это массив ссылочных типов (не, скажем, int[] или DateTime[])
  • Массив, который valueToCompare является одномерным (поэтому либо объявляется как одномерный массив, либо как зубчатый массив)

Вы можете привести непосредственно к object[] вместо Array.

bool Compare(object valueToCompare)
{
   Type t = valueToCompare.GetType();

   if(t.IsArray() && !t.GetElementType().IsValueType && t.GetRank() == 1)
   {
      foreach(var value in (valueToCompare as object[]))
          return Compare(value);
   }
   else
   {
       return Compare(valueToCompare);
   }
}

Если ваш массив имеет типы значений, то вам в основном не повезло.

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

ПРИМЕЧАНИЕ: Как вы уже написали, эта функция будет просто вызывать себя рекурсивно (ветвь else вызывает себя с теми же параметрами) и в итоге приведет к StackOverflowException. Я не верю, что это то, что вы намеревались сделать, но я оставил это как есть, так как я не знаю, что вы на самом деле хотели сделать.

Кроме того, на самом деле это не скомпилируется. Я не уверен, что ваш цикл предназначен для сравнения; как таковой, он будет просто сравниваться с первым элементом массива, но если массив пуст, он не будет возвращать значение (отсюда ошибка компиляции).

Что вы пытаетесь сделать здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...