从对象 [,] 数组 c# 中删除空元素



如何从 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;

相关内容

  • 没有找到相关文章

最新更新