在转换为整型之前先将空字段转换为零

本文关键字:转换 字段 整型 | 更新日期: 2023-09-27 18:05:58

在我的程序中,我循环遍历一个数据表以从每个字段获取数据。我的一行代码是这样的:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);

基本上,我只是取单元格中的值并将其转换为int32。但是,当字段中的数据为空时,我遇到了一个问题。我得到一个关于无法将"DBNull"转换为另一种类型的无效强制转换错误消息。

所以,我知道我可以在尝试转换它之前检查字段的值,像这样做:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == null)
            {
                resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
            }

但是,有更好的方法来做到这一点吗?是否有一些我可以做"内联",而我试图转换的值,而不必诉诸于使用if ?

编辑:我确实尝试使用这个建议的方法:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? "0");

不幸的是,我仍然收到了关于DBNull类型的Invalid Cast错误消息。有人建议我在使用??

操作符

另外,由于我可以完全控制构建数据表的数据,因此我更改了它,以便不会将空值写入任何字段。在这种情况下,这基本上否定了将null转换为int32的需要。谢谢大家的建议!

在转换为整型之前先将空字段转换为零

你可以这样做:

var LYSMKWh =
    resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value)
    ? 0
    : Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);

使用??接线员:

resultsDT.Rows[currentRow][...] ?? "0"

(期望字段是字符串-如果不更改"0")

您可以考虑使用c#的??操作符,该操作符检查值是否为空,如果为空,则为其分配默认值

你可以使用??接线员:

object x = null;
int i = (int)(x ?? 0)

您可以使用自定义转换方法:

public static int ConvertToInt32(object value, int defaultValue) {
    if (value == null)
        return defaultValue;
    return Convert.ToInt32(value);
}

可能需要接受其他类型(如string)的重载。如果两侧的类型不同,则??操作符可能会出现问题。

可以用一个三元操作符替换:

var rowData = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0;

或者,??操作符也可以工作:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0);

可以使用扩展方法

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);
        }
    }
}

检查是否为DBNull.Value而不是null:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == DBNull.Value)
{
    resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}

三元表达式是这样工作的:

var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0;