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

时间:2018-08-17 17:08:28

标签: c# null

如何从C#中的数组=COUNTIFS( $D1, "",$R1, "Closed") 中删除所有null元素。我已经在StackOverflow中看到了类似的问题:Remove blank values in the array using c#

问题是他们正在使用一种名为object[,]的方法来解决简单数组类型Where()的问题,但是我正在处理数组类型object[],不幸的是没有为此类实现方法object[,]。例如:

Where()

然后,object[,] data = new object[2,2]{{null,null},{1,2}}; 包含:

data

如您所见(在我的特定情况下),如果一个元素为null,则该元素的所有行均为null。我想得到:

[0, 0] [object]:null
[0, 1] [object]:null
[1, 0] [object]:1
[1, 1] [object]:2  

有帮助吗?

2 个答案:

答案 0 :(得分:3)

那么二维数组就没有LINQ Where。如果您可以将数组定义更改为object[][],则可以使用foreach遍历“行”并过滤出包含所有空值的行。

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();
    }
}

答案 1 :(得分:2)

方法如下:

  • 计算您要删除的行数
  • 创建适当大小的数组
  • 复制要保留的行

使用辅助方法来检测带有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;