你如何测试 System.Array 中的空元素
How do you test for null elements in System.Array
我正在将 excel 文档解析为 System.Array,然后使用此数据开发 DataTable。问题是并非 System.Array 中的每个元素都包含一个字符串并且为空。见下图:
我的问题是如何测试空值。
这是我的方法:
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.
- 表达式
values.Equals(null)
将抛出 null
,它不会 return true
.
- 调用
anything.ToString()
也会引发 null
,它不会 return null
(或空)字符串引用。
你想做的可能只是:
if(values.GetValue(1, 3) == null) ...
将if (values.GetValue(1, 3).ToString() == null)
改为
if (values.GetValue(1, 3) == null)
实际上,您的 if
,如您所写,在值本身为 null 的情况下,它可能是 "translated" 到 if(null.ToString() ...)
。而且你不能在 null
. 上调用任何东西
我正在将 excel 文档解析为 System.Array,然后使用此数据开发 DataTable。问题是并非 System.Array 中的每个元素都包含一个字符串并且为空。见下图:
我的问题是如何测试空值。
这是我的方法:
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.
- 表达式
values.Equals(null)
将抛出null
,它不会 returntrue
. - 调用
anything.ToString()
也会引发null
,它不会 returnnull
(或空)字符串引用。
你想做的可能只是:
if(values.GetValue(1, 3) == null) ...
将if (values.GetValue(1, 3).ToString() == null)
改为
if (values.GetValue(1, 3) == null)
实际上,您的
if
,如您所写,在值本身为 null 的情况下,它可能是 "translated" 到 if(null.ToString() ...)
。而且你不能在 null
. 上调用任何东西