C# 在转换为int之前将null字段转换为零?
在我的程序中,我循环通过一个数据表从每个字段获取数据。我的一行代码如下所示:C# 在转换为int之前将null字段转换为零?,c#,ado.net,C#,Ado.net,在我的程序中,我循环通过一个数据表从每个字段获取数据。我的一行代码如下所示: int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]); if (resultsDT.Rows[currentRow]["LYSMKWh"] == null) { resultsDT.Rows[currentRow]["LYSMKWh"] = 0; } v
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
if (resultsDT.Rows[currentRow]["LYSMKWh"] == null)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0;
基本上,我只是获取单元格中的值并将其转换为int32。但是,当字段中的数据为空时,我遇到了一个问题。我收到一条无效的强制转换错误消息,说明无法将“DBNull”转换为其他类型
因此,我知道我可以在转换字段之前检查字段的值,方法如下:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
if (resultsDT.Rows[currentRow]["LYSMKWh"] == null)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0;
但是,有没有更好的办法?当我试图转换值而不必使用if
时,是否可以“内联”执行某些操作
编辑:我确实尝试过使用建议的方法:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? "0");
不幸的是,我仍然收到关于DBNull类型的无效强制转换错误消息。有人建议我在使用??运算符,如果两侧的类型不同
另外,由于我对构建数据表时使用的数据拥有完全的控制权,所以我对其进行了更改,这样就不会向任何字段写入空值。因此,在本例中,这几乎不需要将null转换为int32。谢谢大家的建议>P>您可以考虑使用C++的<代码>?/代码>运算符,它检查NULL值,如果它为NULL,则给它分配一个默认值。 您可以这样做:
var LYSMKWh =
resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value)
? 0
: Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
检查它是否为
DBNull.Value
而不是null
:
if (resultsDT.Rows[currentRow]["LYSMKWh"] == DBNull.Value)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
三元表达式的工作原理如下:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
if (resultsDT.Rows[currentRow]["LYSMKWh"] == null)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0;
使用??接线员:
resultsDT.Rows[currentRow][...] ?? "0"
object x = null;
int i = (int)(x ?? 0)
var rowData = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0;
(预期字段为字符串-如果不更改“0”)您可以使用??接线员:
resultsDT.Rows[currentRow][...] ?? "0"
object x = null;
int i = (int)(x ?? 0)
var rowData = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0;
您可以用三元运算符替换它:
resultsDT.Rows[currentRow][...] ?? "0"
object x = null;
int i = (int)(x ?? 0)
var rowData = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0;
或者,??
操作员可以:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0);
但我认为这不太可读。您可以使用自定义转换方法:
public static int ConvertToInt32(object value, int defaultValue) {
if (value == null)
return defaultValue;
return Convert.ToInt32(value);
}
您可能需要采用其他类型(如字符串)的重载。如果两侧的类型不同,则
?
运算符可能会出现问题。可以使用扩展方法
int LYSMKWh = resultsDT.Rows[currentRow]["LYSMKWh"].IfNullThenZero();
创建下面的类
public static class Converter
{
public static Int32 IfNullThenZero(this object value)
{
if (value == DBNull.Value)
{
return 0;
}
else
{
return Convert.ToInt32(value);
}
}
}
例如,
int-LYSMKWh=Convert.ToInt32(resultsDT.Rows[currentRow][“LYSMKWh”]?0)
落入了同样的陷阱-仅当resultsDt.Rows[…][…]的类型为int(或任何从0自动转换的数字)-但是Convert.ToInt32将毫无意义-我猜它是字符串?你是对的。。如果OP控制了数据库,也许他可以将其设置为返回null,并完全删除代码的第一部分(获取并转换为int)。它应该进展顺利…根据您的两条评论,我已经更改了代码,以便在构建datatable时,不会向其任何字段写入空值。所以,现在,我不必担心将null转换为int。我喜欢这个答案。你说得对,我在使用??接线员(我收到了和我的OP相同的错误消息)。我不知道,我有点喜欢你的第二个例子。我从来没用过这个??我的第二个示例还将执行从0到int
的不必要转换,这可能会也可能不会给您带来一些性能问题。我不确定您希望从resultsDT得到什么类型,因此如果您希望得到字符串等,您可能必须输入“0”,而不是仅输入0。这实际上对我来说非常有效。我试着用下面的例子来解释??运算符,但我仍然收到无效的强制转换错误消息。根据用户Code裸体下面所说,使用时可能会出现问题??如果两边的类型不同。简单又漂亮