如何从 C#object[,]
数组中删除所有null
元素。我已经在 StackOverflow 中看到过类似的问题:使用 c# 删除数组中的空白值
问题是他们正在使用一种名为Where()
的方法来解决一个简单的数组类型object[]
的问题,但我正在处理一个数组类型object[,]
不幸的是,没有为这个类实现Where()
方法。例如:
object[,] data = new object[2,2]{{null,null},{1,2}};
然后,data
包含:
[0, 0] [object]:null
[0, 1] [object]:null
[1, 0] [object]:1
[1, 1] [object]:2
如您所见(在我的特定情况下(,如果一个元素为 null,则该元素的所有行均为 null。我想得到 :
[0, 0] [object]:1
[0, 1] [object]:2
有什么帮助吗?
好吧,二维数组没有 LINQWhere
。如果可以将数组定义更改为object[][]
则可以使用foreach
循环访问"行"并筛选出具有所有 null 值的行。
public class RemoveNulls
{
[Test]
public void RemoveNullItems()
{
var items = new object[][] { new object[] { null, null }, new object[] { 1, 2 } };
var cleanRows = new List<object[]>();
foreach (object[] row in items)
{
var newRow = row.Where(item => item != null).ToArray();
if (newRow.Any()) cleanRows.Add(newRow);
}
var result = cleanRows.ToArray();
}
}
方法如下:
- 计算要删除的行数
- 创建适当大小的数组
- 复制要保留的行
使用帮助程序方法检测具有null
的行:
static bool RowHasNull(object[,] data, int row) {
return Enumerable.Range(0, data.GetLength(1)).Any(c => data[row,c] == null);
}
现在实现将如下所示:
var oldRowCount = data.GetLength(0);
var newRowCount = oldRowCount - Enumerable.Range(0, oldRowCount).Count(r => RowHasNull(data, r));
if (newRowCount == 0) ... // the array is empty, do something about it - e.g. throw an exception
var res = new object[newRowCount, data.GetLength(1)];
int r = 0;
for (var row = 0 ; row != oldRowCount ; row++) {
if (RowHasNull(data, row)) {
continue;
}
for (int c = 0 ; c != data.GetLength(1) ; c++) {
res[r,c] = data[row, c];
}
r++;
}
return res;