如何测试 System.Array 中的空元素

Posted

技术标签:

【中文标题】如何测试 System.Array 中的空元素【英文标题】:How do you test for null elements in System.Array 【发布时间】:2015-11-25 12:23:36 【问题描述】:

我正在将一个 excel 文档解析为一个 System.Array,然后使用这些数据来开发一个 DataTable。问题是并非 System.Array 中的每个元素都包含一个字符串并且为空。见下图:

我的问题是如何测试 null 情况。

这是我的方法:

public static System.Data.DataTable ConvertCSVtoDataTable(string strFilePath)
    
        System.Data.DataTable dt = new System.Data.DataTable();
        StreamReader sr = new StreamReader(strFilePath);
        string[] headers = sr.ReadLine().Split(',');
        foreach (string header in headers)
            dt.Columns.Add(header);
        sr.Close();

        Microsoft.Office.Interop.Excel.Workbook wb = null;
        Microsoft.Office.Interop.Excel.Worksheet ws = null;
        Microsoft.Office.Interop.Excel.Application app = null;
        int lastRow = 0;

        app = new Microsoft.Office.Interop.Excel.Application();
        app.Visible = false;
        wb = app.Workbooks.Open(strFilePath);
        ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets[1];
        lastRow = ws.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Row;
        int currentRow = 0;
        for (int index = 2; index <= lastRow; index++)
        
            System.Array values = (System.Array)ws.get_Range("A" + index.ToString(), "M" + index.ToString()).Cells.Value;

                dt.Rows.Add();
            dt.Rows[currentRow]["Plugin ID"] = values.GetValue(1, 1).ToString();
            dt.Rows[currentRow]["CVE"] = values.GetValue(1, 2).ToString();
            dt.Rows[currentRow]["CVSS"] = values.GetValue(1, 3).ToString();
            dt.Rows[currentRow]["Risk"] = values.GetValue(1, 4).ToString();
            dt.Rows[currentRow]["Host"] = values.GetValue(1, 5).ToString();
            dt.Rows[currentRow]["Protocol"] = values.GetValue(1, 6).ToString();
            dt.Rows[currentRow]["Port"] = values.GetValue(1, 7).ToString();
            dt.Rows[currentRow]["Name"] = values.GetValue(1, 8).ToString();
            dt.Rows[currentRow]["Synopsis"] = values.GetValue(1, 9).ToString();
            dt.Rows[currentRow]["Description"] = values.GetValue(1, 10).ToString();
            dt.Rows[currentRow]["Solution"] = values.GetValue(1, 11).ToString();
            dt.Rows[currentRow]["See Also"] = values.GetValue(1, 12).ToString();
            dt.Rows[currentRow]["Plugin Output"] = values.GetValue(1, 13).ToString();
            currentRow++;
        
        return dt;
    

以下是我尝试过但没有奏效的一些检查

if (!values.Equals(null))
   dt.Rows[currentRow]["CVSS"] = values.GetValue(1, 3).ToString();
else
    dt.Rows[currentRow]["CVSS"] = "";

这似乎不起作用,因为它似乎正在检查是否存在任何元素,而不是该位置的特定元素是否为空。

if (values.GetValue(1, 3).ToString() == null)
    dt.Rows[currentRow]["CVSS"] = "";
else
   dt.Rows[currentRow]["CVSS"] = values.GetValue(1, 3).ToString();

这会引发 NullReferenceExecption:Object reference not set to an instance of an object.

【问题讨论】:

您不能在 null 上调用 ToString()。你的 if 应该是:if(values.GetValue(1,3) == null),因为values 本身不为空 也可以使用ToString 代替Convert.ToString(...)。在这种情况下,您似乎不需要if 【参考方案1】: 表达式values.Equals(null) 将抛出null,它不会返回true。 调用anything.ToString() 也会抛出null,它不会返回null(或空)字符串引用。

你想做的可能只是:

if(values.GetValue(1, 3) == null) ...

【讨论】:

【参考方案2】:

if (values.GetValue(1, 3).ToString() == null) 更改为

if (values.GetValue(1, 3) == null)


实际上,您的if,正如您所写的那样,在值本身为空的情况下,它可以“翻译”为if(null.ToString() ...)。你不能在null 上打电话。

【讨论】:

以上是关于如何测试 System.Array 中的空元素的主要内容,如果未能解决你的问题,请参考以下文章

如何删除多维字符串数组中的空元素?

如何解决spring boot test中的空指针异常?

如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型

EXCEL函数去除数组中的0值和空值

如何理解 GraphQL 中的空边和节点

如何检查数组是不是是Javascript中的空数组数组