?? оператор в системе.

Есть ли оператор или встроенная функция, чтобы просто это:

myVal = object1.object2.something(a,b).dataColumn.toString()==""?object1.object2.something(a,b).dataColumn.toString():"-";

Я знаю, что могу сделать что-то вроде:

string str = object1.object2.something(a,b).dataColumn.toString();
myVal =str==""?"-":str;

но у меня есть много объектов, и я хочу избежать этого:

string str1 = object1.object2.something(a,b).dataColumn1.toString();
myVal1==""?str1:"-"
string str2 = object1.object2.something(a,b).dataColumn2.toString();
myVal2==""?str2:"-"
:
string strN = object1.object2.something(a,b).dataColumnN.toString();
myValN==""?strN:"-"

Я также могу создать функцию:

private string CheckNull(object dataColumn){
    return dataColumn == System.DBNull?"-":dataColumn.toString();
}

myVal1 = CheckNull(object1.object2.something1(a,b).dataColumn.toString())
myVal2 = CheckNull(object1.object2.something2(a,b).dataColumn.toString())
myVal3 = CheckNull(object1.object2.something3(a,b).dataColumn.toString())

Самый простой способ - использовать оператор, но проблема в том, что 'dataColumn' не совместим с?? потому что иногда возвращает system.DBNull вместо NULL. Посмотрите на непосредственный вывод окна:

System.DBNull??"-"
'System.DBNull' is a 'type', which is not valid in the given context
null??"-"
"-"

Интересно, есть ли какая-либо (строковая) функция или оператор, который может вернуть "-" if dataColumn.toString()=="" без if..then (потому что мне пришлось бы сделать много if..then для всех них В противном случае я скорее использую функциональный подход, показанный выше.

string str = object1.object2.something(a,b).dataColumn.toString().if("","-");

3 ответа

Как насчет:

public static class StringHelper {
    public static string ValueOrDash(this string value) {
        return string.IsNullOrEmpty(value) ? "-" : value;
    }
}

Тогда вы можете просто сделать:

myVal = object1.object2.something(a,b).DataColumn.ToString().ValueOrDash();

Или еще лучше:

public static class StringHelper {
    public static string ValueOrWhatever(this string value, string defaultValue) {
        return string.IsNullOrEmpty(value) ? defaultValue : value;
    }
}

myVal = object1.object2.something(a,b).DataColumn.ToString().ValueOrWhatever("-");

Если базовый объект всегда является либо строкой, либо DbNull, вы можете использовать as оператор приведения:

private string CheckNull(object dataColumn){
    return dataColumn == (dataColumn as string)??"-":dataColumn;
}

Это также возвратит "-", если значение является целым числом, например, или другого типа.

Это не ясно из вашего кода, но если эти значения поступают из DataRows, вы можете использовать новый (.NET 3.5) DataRowExtensions.Field функция, которая будет возвращать null вместо DbNull,

Вы можете написать метод расширения для вызова dataColumn. Тем не менее, функционально он не будет сильно отличаться от вашего метода CheckNull.

Или в вашем первом примере с str1, str2, strN и прочим, есть ли причина, по которой вы не можете повторно использовать str1 для каждого? Я вижу, что у вас есть вызов метода в вашей длинной строке кода, вы бы не хотели тратить время на выполнение чаще, чем нужно (особенно если это будет приводить к одному и тому же выводу каждый раз).

Другие вопросы по тегам