【问题标题】:Removing null elements from an object[,] array c#从 object[,] 数组 c# 中删除空元素
【发布时间】:2018-08-17 17:08:27
【问题描述】:

如何在 C# 中从数组 object[,] 中删除所有 null 元素。我已经在 StackOverflow 中看到过类似的问题:Remove blank values in the array using 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  

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

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

有什么帮助吗?

【问题讨论】:

    标签: c# null


    【解决方案1】:

    好吧,二维数组没有 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();
        }
    }
    

    【讨论】:

    • 您好,感谢您的回答。您是否已经测试过您的代码?我在行有一个错误:var newRow = row.Where(item => item != null).ToArray();例外是:System.ArgumentNullException:'值不能为空。参数名称:source'
    • 这是正常的,因为变量row 在他第一次出现时为空。
    • IList&lt;object[]&gt; cleanRows = Enumerable.Empty&lt;object[]&gt;().ToList();?那只是var cleanRows = new List&lt;object[]&gt;();吗?
    • @BoubacarTraoré 不幸的是,我在考虑数组数组而不是二维数组。我会暂时删除,直到我可以修复它。
    • @Ry- 是的,不错
    【解决方案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;
    

    【讨论】:

    • 另外,如果“如果一个元素为空,则该元素的所有行都为空”为真,那么RowHasNull 可以是data[row, 0] == null。 (Enumerable.Range 括号在正确的位置吗?)
    • @Ry- 对,括号放错了位置。您对data[row,0] 的看法也是正确的,但由于添加一点泛化“成本”只需要一行代码,我想我不妨这样做。
    • 太棒了!非常感谢,这解决了我的问题!您还应该更正您的第二行: var newRowCount = oldRowCount - Enumerable.Range(0, rowCount).Count(r => RowHasNull(data, r));如您所见,变量rowCount 不存在。我猜你的意思是oldRowCount
    猜你喜欢
    • 1970-01-01
    • 2018-08-06
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2023-03-09
    • 2013-03-27
    相关资源
    最近更新 更多