Подтвердить что ты не робот

Преобразование нулевого поля в ноль перед преобразованием в int?

В моей программе я перебираю данные, чтобы получать данные из каждого поля. Одна строка моего кода выглядит так:

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

В принципе, я просто беру значение, которое в ячейке, и преобразовываю его в int32. Я сталкиваюсь с проблемой, хотя, когда данные в поле являются нулевыми. Я получаю сообщение об ошибке Invalid Cast о невозможности конвертировать "DBNull" в другой тип.

Итак, я знаю, что я могу просто проверить значение поля, прежде чем пытаюсь преобразовать его, выполнив что-то вроде этого:

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

Но есть ли лучший способ сделать это? Есть ли что-то, что я могу сделать "inline", пока я пытаюсь преобразовать значение, не прибегая к использованию if?

EDIT: я попытался использовать этот предложенный метод:

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

К сожалению, я все еще получил сообщение об ошибке Invalid Cast в отношении типа DBNull. Было высказано предположение, что у меня могут быть проблемы с использованием если типы с обеих сторон были разными.

Кроме того, поскольку у меня есть полный контроль над данными, с которыми я строю свой datatable, я изменил его так, чтобы никакие нулевые значения не были записаны ни в какое поле. Таким образом, это в значительной степени отрицает необходимость преобразования null в int32, в этом случае. Спасибо за все советы, всем!

4b9b3361

Ответ 1

Вы можете сделать это:

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

Ответ 2

используйте Оператор:

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

(ожидая, что поле будет строкой - если не изменить "0" )

Ответ 3

Вы можете использовать оператор С# ??, который проверяет значение для null и если оно null, присваивает ему значение по умолчанию.

Ответ 4

Вы можете использовать собственный метод конвертации:

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

Вам могут потребоваться перегрузки, которые берут другие типы, такие как строка. У вас могут быть проблемы с оператором ??, если типы с обеих сторон разные.

Ответ 5

Вы можете заменить его тройным оператором:

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

В качестве альтернативы оператор ?? мог бы работать:

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

Но я думаю, что это менее читаемо.

Ответ 6

Проверьте, если он 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;

Ответ 7

Вы можете использовать Оператор:

object x = null;

int i = (int)(x ?? 0)

Ответ 8

Вы можете использовать метод расширения.

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