Как быстро удалить пустые элементы из объекта типа object[,]?
Есть объект 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 шт):
Автор решения: Arkee
→ Ссылка
Методы 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