?? 合并空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#已经让我们用null
replace??
。 所以我们需要的是一个将空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