?? Коалесцировать пустую строку?
Что-то, что я делаю все больше и больше, проверяет строку для пустого (как в ""
или null) и условного оператора.
Текущий пример:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Это просто метод расширения, который эквивалентен:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Поскольку он пуст и не равен нулю, ??
не будет делать трюк. A string.IsNullOrEmpty()
версия ??
будет идеальным решением. Я думаю, что должен быть более чистый способ сделать это (надеюсь!), Но я был в затруднении, чтобы найти его.
Кто-нибудь знает лучший способ сделать это, даже если он только в .Net 4.0?
Ответы
Ответ 1
Существует не встроенный способ сделать это. Тем не менее, вы можете сделать ваш метод расширения возвратом строки или null, что позволит работать с коалесцирующим оператором. Однако это было бы странно, и я лично предпочитаю ваш нынешний подход.
Поскольку вы уже используете метод расширения, почему бы просто не создать тот, который возвращает значение или значение по умолчанию:
string result = s.SiteNumber.ConvertNullOrEmptyTo("No Number");
Ответ 2
С# уже позволяет заменить значения null
на ??
. Итак, все, что нам нужно, это расширение, которое преобразует пустую строку в null
, а затем мы используем ее следующим образом:
s.SiteNumber.NullIfEmpty() ?? "No Number";
Ответ 3
Я знаю, что это старый вопрос, но я искал ответ, и ни один из вышеперечисленных не соответствовал моей потребности, а также тем, что я использовал:
private static string Coalesce(params string[] strings)
{
return strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
}
Использование:
string result = Coalesce(s.SiteNumber, s.AltSiteNumber, "No Number");
EDIT:
Еще более компактный способ записи этой функции:
static string Coalesce(params string[] strings) => strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
Ответ 4
У меня есть несколько расширений, которые мне нравятся:
public static string OrDefault(this string str, string @default = default(string))
{
return string.IsNullOrEmpty(str) ? @default : str;
}
public static object OrDefault(this string str, object @default)
{
return string.IsNullOrEmpty(str) ? @default : str;
}
Изменить: Вдохновленный ответом sfsr, я сейчас добавлю этот вариант в свою панель инструментов:
public static string Coalesce(this string str, params string[] strings)
{
return (new[] {str})
.Concat(strings)
.FirstOrDefault(s => !string.IsNullOrEmpty(s));
}
Ответ 5
Несколько более быстрый метод расширения, чем предлагалось ранее, возможно:
public static string Fallback(this string @this, string @default = "")
{
return (@this == null || @this.Trim().Length == 0) ? @default : @this;
}
Ответ 6
как насчет метода расширения строки ValueOrDefault()
public static string ValueOrDefault(this string s, string sDefault)
{
if (string.IsNullOrEmpty(s))
return sDefault;
return s;
}
или вернуть значение null, если строка пуста:
public static string Value(this string s)
{
if (string.IsNullOrEmpty(s))
return null;
return s;
}
Не пытались использовать эти решения.
Ответ 7
Я использую собственный метод расширения Coalesce. Поскольку эти функции используют LINQ и полностью истощают ресурсы для интенсивных операций (я использую их в жестких циклах), я поделюсь своим:
public static class StringCoalesceExtension
{
public static string Coalesce(this string s1, string s2)
{
return string.IsNullOrWhiteSpace(s1) ? s2 : s1;
}
}
Я думаю, что это довольно просто, и вам даже не нужно беспокоиться о нулевых строковых значениях. Используйте его так:
string s1 = null;
string s2 = "";
string s3 = "loudenvier";
string s = s1.Coalesce(s2.Coalesce(s3));
Assert.AreEqual("loudenvier", s);
Я использую его много. Одна из тех функций "полезности", с которыми вы не можете жить без первого использования: -)
Ответ 8
Одним из преимуществ оператора нуль-коалесценции является то, что он короткозамкнутый. Когда первая часть не равна нулю, вторая часть не оценивается. Это может быть полезно, когда резерв требует дорогостоящей операции.
Я закончил с:
public static string Coalesce(this string s, Func<string> func)
{
return String.IsNullOrEmpty(s) ? func() : s;
}
Использование:
string navigationTitle = model?.NavigationTitle.
Coalesce(() => RemoteTitleLookup(model?.ID)). // Expensive!
Coalesce(() => model?.DisplayName);
Ответ 9
Мне нравится краткость следующего метода расширения QQQ
для этого, хотя, конечно, оператор вроде? было бы лучше. Но мы можем это сделать, разрешив сравнивать не только два, а три значения параметров строки, из которых каждый сталкивается с необходимостью обрабатывать время от времени (см. Вторую функцию ниже).
#region QQ
[DebuggerStepThrough]
public static string QQQ(this string str, string value2)
{
return (str != null && str.Length > 0)
? str
: value2;
}
[DebuggerStepThrough]
public static string QQQ(this string str, string value2, string value3)
{
return (str != null && str.Length > 0)
? str
: (value2 != null && value2.Length > 0)
? value2
: value3;
}
// Following is only two QQ, just checks null, but allows more than 1 string unlike ?? can do:
[DebuggerStepThrough]
public static string QQ(this string str, string value2, string value3)
{
return (str != null)
? str
: (value2 != null)
? value2
: value3;
}
#endregion