Отменить оператор нулевой коалесценции
У меня есть куча строк, которые мне нужно использовать .Trim(), но они могут быть пустыми. Было бы гораздо более кратким, если бы я мог сделать что-то вроде:
string endString = startString !?? startString.Trim();
В принципе вернуть часть справа, если часть слева не равна NULL, иначе просто верните нулевое значение. Я только что закончил использование тернарного оператора, но все равно использовать для этого нуль-коалесцирующий оператор?
Ответы
Ответ 1
Вы можете создать метод расширения, который возвращает null
при попытке обрезать значение.
public String TrimIfNotNull(this string item)
{
if(String.IsNullOrEmpty(item))
return item;
else
return item.Trim();
}
Заметьте, что вы не можете назвать его Trim, потому что методы расширения не могут переопределять методы экземпляра.
Ответ 2
Не для спецификации: Не то, чтобы мне это нравилось, но вы могли бы использовать:
string endString = (startString ?? String.Empty).Trim();
В спецификации, лучше как метод расширения, например @Kevin's:
string endString = (startString == null ? null : startString.Trim());
Ответ 3
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();
Хотя я также пошел по пути создания метода расширения строки под названием "safeTrim", который делает то, что вы описываете в одном методе, вместо того, чтобы каждый раз использовать этот рецепт. Проверьте Kevin respone для кода.
РЕДАКТИРОВАТЬ: wow у меня были всевозможные обратные, ошибочно названные переменные и обратные тернарные операторы, тем более причина писать один метод расширения, а код лучше проверить, чем я сделал!
Ответ 4
Используйте
string endString = (startString ?? "").Trim();
В этом случае используется строка empy, если startString имеет значение NULL. Тем не менее, не возвращает значение null, когда endString
имеет значение null.
Ответ 5
Извините за некромантию, но у меня была такая же проблема, и я решил это с помощью лямбда-операции. Это не самый красивый, но он сохраняет мой код кратким.
Это позор С# не поддерживает статический импорт или импорт отдельных функций, но в любом случае:
Определите эту функцию где-нибудь:
private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
if( parent == null ) return default(TResult);
return operation( parent );
}
Затем, чтобы использовать его в вашем примере:
String endString = N(startString, s => s.Trim());
Функция N
возвращает null
, если первый аргумент равен NULL, иначе он будет оценивать указанную лямбда-функцию со значением в качестве аргумента.
Вы можете вложить его, конечно, так. Например, чтобы безопасно разыменовать длинную цепочку, например
String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;
если какое-либо из этих свойств или методов возвращает значение null, вам нужно вставлять нулевые проверки везде, или вы можете сделать это:
String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);
Как я уже сказал, это не самый красивый:)
Вы можете упростить это, сделав N
метод расширения System.Object
, например:
String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );
... который, я думаю, намного более аккуратен.
Ответ 6
Следующее не распространяется на null, но принимает значение null в качестве параметра и возвращает пустую строку в этом случае.
using Microsoft.VisualBasic; // you need to add a reference to Microsoft.VisualBasic.dll
...
string endString = Strings.Trim(startString);
...
<суб > утка & работать...суб >
Ответ 7
Создайте метод, например:
string MyTrim(string a) {
if (a != null) {
a = a.Trim();
}
return a;
}
Ответ 8
Как в качестве примечания, если вы используете .NET 4, есть новый удобный метод String.IsNullOrWhiteSpace
, который вы можете использовать.