Отменить оператор нулевой коалесценции

У меня есть куча строк, которые мне нужно использовать .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, который вы можете использовать.