Как быстро удалить пустые элементы из объекта типа object[,]?

Рейтинг: 0Ответов: 1Опубликовано: 03.02.2023

Есть объект data типа object[,]. Пример его наполнения:

[1, 1]  "Данные1"   object {string}
[1, 2]  null        object
[1, 3]  null        object
[1, 4]  "Данные2"   object {string}
[1, 5]  null        object
[1, 6]  null        object
[1, 7]  "Данные3"   object {string}
[1, 8]  "Данные4"   object {string}
[1, 9]  null        object

Как можно быстро удалить пустые элементы?

Пробовал что-то типа такого:

var myarray = data.Cast<object[,]>().ToList().Where(c => c != null).ToArray();

Выдаётся ошибка...

В результате я хочу видеть такое наполнение:

[1, 1]  "Данные1"   object {string}
[1, 2]  "Данные2"   object {string}
[1, 3]  "Данные3"   object {string}
[1, 4]  "Данные4"   object {string}

Ответы

▲ 1

Методы System.Linq работают с коллекциями (к примеру, IEnumerable). Да, существует конвертация с коллекции на массив, но она работает только с одномерными массивами. Поэтому в основном применяют ступенчатые массивы для работы с System.Linq. При этом формат данных будет отличаться, к примеру: object[][].

Для работы с двумерным массивом (или более) можно использовать стандартный метод перебора значений.

object?[,] data = new object?[,]
{
  { 1, "Данные1" },
  { 2, "Данные2" },
  { 3, null },
  { 4, "Данные4" },
  { null, "Данные5" },
  { null, null },
  { 7, "Данные7" },
  { null, null }
};

int rows = data.GetUpperBound(0) + 1;
int columns = data.GetUpperBound(1) + 1;
object[,] output = new object[0, columns];
int filteredRowsCount = 0;

for (int i = 0; i < rows; i++)
{
  bool isNullExists = false;
  for (int j = 0; j < columns; j++)
  {
    if (data[i, j] is null)
    {
      isNullExists = true;
      break;
    }
  }
  if (!isNullExists)
  {
    int outputRows = filteredRowsCount;
    filteredRowsCount++;
    object[,] extendOutput = new object[filteredRowsCount, columns];
    for (int j = 0; j < outputRows; j++)
    {
      for (int k = 0; k < columns; k++)
      {
        extendOutput[j, k] = output[j, k];
      }
    }
    for (int j = 0; j < columns; j++)
    {
      extendOutput[filteredRowsCount - 1, j] = data[i, j];
    }
    output = extendOutput;
  }
}

//далее работаем с output