?? оператор в системе. - PullRequest
2 голосов
/ 24 июня 2011

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

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??"-"
"-"

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

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

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Как насчет:

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("-");
1 голос
/ 24 июня 2011

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

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

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

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

0 голосов
/ 24 июня 2011

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

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

...