?? 合并空string?

我发现自己做的事情越来越多的是检查一个string为空(如""或null)和一个条件运算符。

当前的例子:

 s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber; 

这只是一个扩展方法,相当于:

 string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber; 

既然它是空的而不是空的, ?? 将不会做的伎俩。 一个string.IsNullOrEmpty()版本 将是完美的解决scheme。 我认为必须有一个更干净的方式做到这一点(我希望!),但我一直在find它的损失。

有没有人知道更好的方法来做到这一点,即使它只是在.NET 4.0?

没有内置的方法来做到这一点。 您可以让您的扩展方法返回一个string或null,但是,这将允许合并运算符工作。 然而,这将是奇怪的,我个人更喜欢你目前的做法。

既然你已经使用了扩展方法,为什么不只是返回一个值或一个默认值:

 string result = s.SiteNumber.ConvertNullOrEmptyTo("No Number"); 

C#已经让我们用nullreplace?? 。 所以我们需要的是一个将空string转换为空的扩展,然后我们像这样使用它:

 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"); 

编辑:写这个function的更紧凑的方式是:

 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; } 

怎么样string扩展方法ValueOrDefault()

 public static string ValueOrDefault(this string s, string sDefault) { if (string.IsNullOrEmpty(s)) return sDefault; return s; } 

或者如果string为空,则返回null:

 public static string Value(this string s) { if (string.IsNullOrEmpty(s)) return null; return s; } 

虽然没有尝试这些解决scheme。

我正在使用我自己的stringCoalesce扩展方法。 由于这里使用的是LINQ,绝对是浪费时间密集型操作的资源(我使用它在紧密的循环中),我会分享我的:

 public static class StringCoalesceExtension { public static string Coalesce(this string s1, string s2) { return string.IsNullOrWhiteSpace(s1) ? s2 : s1; } } 

我认为这很简单,你甚至不需要打扰空string值。 像这样使用它:

 string s1 = null; string s2 = ""; string s3 = "loudenvier"; string s = s1.Coalesce(s2.Coalesce(s3)); Assert.AreEqual("loudenvier", s); 

我用了很多。 这些“实用”function之一,你第一次使用后,你不能没有生活:-)

空合并运算符的优点之一是短路。 当第一部分不为空时,第二部分不被评估。 当回退需要昂贵的操作时,这可能是有用的。

我结束了:

 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); 

我喜欢下面的这个扩展方法QQQ的简洁性,虽然当然是一个像? 会更好。 但是我们可以通过允许不只是两个而是三个string选项值进行比较,哪一个会遇到需要处理的时间(见下面的第二个函数)。

 #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