如何从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
有帮助吗?
答案 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;