?? 合并空字符串?

Nic*_*ver 154 c# string coalesce null-coalescing-operator

我发现自己做的越来越多的事情是检查字符串是否为空(如in ""或null)和条件运算符.

一个当前的例子:

s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Run Code Online (Sandbox Code Playgroud)

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

string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Run Code Online (Sandbox Code Playgroud)

因为它是空的而不是null,所以??不会这样做.一个string.IsNullOrEmpty()版本??将是完美的解决方案.我认为必须有一个更清洁的方式来做这件事(我希望!),但我一直在找不到它.

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

Red*_*ter 121

C#已经让我们的替代值null??.所以我们需要的是一个将空字符串转换为的扩展,null然后我们像这样使用它:

s.SiteNumber.NullIfEmpty() ?? "No Number";
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 70

没有内置的方法来做到这一点.您可以使您的扩展方法返回一个字符串或null,但这将允许合并运算符工作.然而,这很奇怪,我个人更喜欢你现在的做法.

由于您已经在使用扩展方法,为什么不只是创建一个返回值或默认值:

string result = s.SiteNumber.ConvertNullOrEmptyTo("No Number");
Run Code Online (Sandbox Code Playgroud)

  • 我认为你是对的,这是目前最干净的解决方案,仍然可读.我喜欢C#5中的`???'操作符,但谁知道呢. (6认同)
  • 什么会??? 操作员呢?除了null之外还取默认值?听起来非常复杂 (2认同)

sfs*_*fsr 39

我知道这是一个老问题 - 但我一直在寻找答案,以上所有内容都不符合我的需要以及我最终使用的内容:

private static string Coalesce(params string[] strings)
{
    return strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
}
Run Code Online (Sandbox Code Playgroud)

用法:

string result = Coalesce(s.SiteNumber, s.AltSiteNumber, "No Number");
Run Code Online (Sandbox Code Playgroud)

编辑: 编写此函数的更紧凑的方法是:

static string Coalesce(params string[] strings) => strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
Run Code Online (Sandbox Code Playgroud)

  • 因为Coalesce是许多数据库用来执行相同操作的术语(找到第一个非空值).将字符串连接在一起是串联. (5认同)

Jus*_*gan 15

我有几个我喜欢使用的实用程序扩展:

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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:受sfsr的回答启发,我将从现在开始将这个变体添加到我的工具箱中:

public static string Coalesce(this string str, params string[] strings)
{
    return (new[] {str})
        .Concat(strings)
        .FirstOrDefault(s => !string.IsNullOrEmpty(s));
}
Run Code Online (Sandbox Code Playgroud)

  • @druciferre - 这只是允许您使用 `default` 作为变量名,即使它是 C# 中的保留关键字。 (3认同)
  • 我肯定使用“Coalesce”术语,因为它更接近空合并运算符 (??) 的意图,尽管我将其更改为“CoalesceTo”。 (2认同)
  • @Jimmyt1988 - 还因为它专门选择任意长度列表中的*第一个*非空函数。这是一个微妙的细节,但 T-SQL 函数的工作方式相同。这个名称让任何知道该函数的人(无论有或没有文档)都很直观。 (2认同)

小智 6

比之前提出的扩展方法稍快一些:

public static string Fallback(this string @this, string @default = "")
{
    return (@this == null || @this.Trim().Length == 0) ? @default : @this;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用[IsNullOrWhitespace](http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx)而不是修剪和加长它. (11认同)

wen*_*een 6

零空值运算符的一个优点是它短路.当第一部分不为null时,不评估第二部分.当后备需要昂贵的操作时,这可能很有用.

我结束了:

public static string Coalesce(this string s, Func<string> func)
{
    return String.IsNullOrEmpty(s) ? func() : s;
}
Run Code Online (Sandbox Code Playgroud)

用法:

string navigationTitle = model?.NavigationTitle.
    Coalesce(() => RemoteTitleLookup(model?.ID)). // Expensive!
    Coalesce(() => model?.DisplayName);
Run Code Online (Sandbox Code Playgroud)


jjr*_*000 6

我只是使用 NullIfEmpty 扩展方法,如果字符串为空允许 ?? (空合并运算符)正常使用。

public static string NullIfEmpty(this string s)
{
    return string.IsNullOrEmpty(s) ? null : s;
}
Run Code Online (Sandbox Code Playgroud)

这然后允许?? 正常使用并使链接易于阅读。

string string1 = string2.NullIfEmpty() ?? string3.NullIfEmpty() ?? string4;
Run Code Online (Sandbox Code Playgroud)