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裸体下面所说,使用时可能会出现问题??如果两边的类型不同。简单又漂亮