? Слияние для пустой строки?
то, что я делаю все больше и больше, проверяет строку на пустоту (как в ""
или null) и условный оператор.
свежий пример:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
это просто метод расширения, это эквивалентно:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
так как он пустой и не нулевой,??
не будет делать трюк. А string.IsNullOrEmpty()
версия ??
было бы идеальным решением. Я думаю, что должен быть более чистый способ сделать это (я надеюсь!), но я была на потеря, чтобы найти его.
кто-нибудь знает лучший способ сделать это, даже если это только в .Net 4.0?
10 ответов:
нет встроенного способа сделать это. Однако вы можете заставить свой метод расширения возвращать строку или null, что позволит оператору объединения работать. Это было бы странно, однако, и я лично предпочитаю ваш нынешний подход.
поскольку вы уже используете метод расширения, почему бы просто не сделать одну, которая возвращает значение или значение по умолчанию:
string result = s.SiteNumber.ConvertNullOrEmptyTo("No Number");
C# уже позволяет нам подставлять значения
null
С??
. Поэтому все, что нам нужно, это расширение, которое преобразует пустую строку вnull
, а затем мы используем его так:s.SiteNumber.NullIfEmpty() ?? "No Number";
Я знаю, что это старый вопрос - но я искал ответ, и ни один из вышеперечисленных не соответствует моим потребностям, а также тому, что я в конечном итоге использовал:
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));
у меня есть несколько расширений утилиты, которые я хотел бы использовать:
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)); }
немного более быстрый метод расширения, чем предлагалось ранее, возможно:
public static string Fallback(this string @this, string @default = "") { return (@this == null || @this.Trim().Length == 0) ? @default : @this; }
Как насчет метода расширения строки 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; }
не пробовал эти решения, хотя.
одним из преимуществ нуль-коалесцирующего оператора является то, что он закорачивает. Когда первая часть не равна нулю, вторая часть не оценивается. Это может быть полезно, когда резервный вариант требует дорогостоящей операции.
Я закончил с:
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);
Я использую собственный метод расширения слияния строк. Поскольку те, кто здесь использует 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);
Я использую его много. Одна из тех" утилитарных " функций, без которых вы не можете жить после первого использования: -)
Я просто использую метод расширения NullIfEmpty, который всегда будет возвращать null, если строка пуста ?? (Нулевой оператор Коалесценции) для использования в обычном режиме.
Это позволяет ?? быть использованным как нормальный и делает приковывать легким прочитать.public static string NullIfEmpty(this string s) { return s.IsNullOrEmpty() ? null : s; }
string string1 = string2.NullIfEmpty() ?? string3.NullIfEmpty() ?? string4;
мне нравится краткость следующего метода расширения
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