Отрицать нуль-сливающийся оператор - PullRequest
14 голосов
/ 18 мая 2010

У меня есть куча строк, которые мне нужно использовать .Trim (), но они могут быть нулевыми. Было бы гораздо более кратким, если бы я мог сделать что-то вроде:

string endString = startString !?? startString.Trim();

В основном возвращает часть справа, если часть слева НЕ является нулевой, в противном случае просто верните нулевое значение. Я только что закончил тем, что использовал троичный оператор, но есть ли в любом случае использовать для этого нуль-объединяющий оператор?

Ответы [ 9 ]

12 голосов
/ 18 мая 2010

Вы можете создать метод расширения, который возвращает null, когда он пытается обрезать значение.

public String TrimIfNotNull(this string item)
{
   if(String.IsNullOrEmpty(item))
     return item;
   else
    return item.Trim();
}

Обратите внимание, вы не можете назвать его Trim, потому что методы расширения не могут переопределить методы экземпляра.

12 голосов
/ 18 мая 2010

Не для спецификации: Не то, чтобы мне это нравилось, но вы могли бы использовать:

string endString = (startString ?? String.Empty).Trim();

На спецификацию лучше в качестве метода расширения, например @ Kevin's:

string endString = (startString == null ? null : startString.Trim());
4 голосов
/ 18 мая 2010
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();

Хотя я также пошел по пути написания метода расширения строки, называемого safeTrim, который выполняет то, что вы описываете в одном методе, вместо того, чтобы каждый раз использовать этот рецепт. Проверьте Ответ Кевина для кода.

РЕДАКТИРОВАТЬ : вау, у меня все это было в обратном порядке, с неверно названными переменными и обратными тернарными операторами, все больше причин писать один метод расширения и проверять код лучше, чем я!

1 голос
/ 18 февраля 2013

Извините за некромантию, но у меня возникла такая же проблема, и я решил ее с помощью лямбда-операции. Это не самый красивый, но он сохраняет мой код лаконичным.

Обидно, что C # не поддерживает статический импорт или импорт отдельных функций, но в любом случае:

Определите эту функцию где-нибудь:

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, если первый аргумент равен нулю, в противном случае она оценивает указанную лямбда-функцию со значением в качестве аргумента.

Вы можете вложить это, конечно, так. Например, для безопасного разыменования длинной цепочки, например

String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;

если какое-либо из этих свойств или методов возвращает ноль, вам нужно везде вставлять нулевые проверки, или вы можете сделать это:

String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);

Как я уже сказал, это не самая красивая :) 1021 *

Вы можете упростить это, сделав N методом расширения System.Object, например так:

String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );

... что я считаю намного аккуратнее.

1 голос
/ 18 мая 2010

Использование

string endString = (startString ?? "").Trim();

Используется строка empy, если startString имеет значение null. Это, однако, не возвращает ноль, когда endString равно нулю.

0 голосов
/ 27 июля 2018

Начиная с C # 6.0 (.NET Framework 4.6 / Visual Studio 2015) вы можете использовать нулевой условный доступ к элементу :

 string? endString = startString?.Trim();
0 голосов
/ 18 мая 2010

Как примечание: если вы используете .NET 4, есть новый удобный метод String.IsNullOrWhiteSpace, который вы можете использовать.

0 голосов
/ 18 мая 2010

Создайте метод, такой как:

string MyTrim(string a) {
    if (a != null) {
        a = a.Trim();
    }
    return a;
}
0 голосов
/ 18 мая 2010

Следующее не распространяется на ноль, но принимает ноль в качестве параметра и возвращает пустую строку в этом случае.

using Microsoft.VisualBasic;  // you need to add a reference to Microsoft.VisualBasic.dll

    ...
    string endString = Strings.Trim(startString);
    ...

duck & run ...

...