C# 中是否有一个优雅/内置的方法来添加字符串连接器 IFF 两个字符串的长度> 0

本文关键字:字符串 IFF 两个 连接器 添加 有一个 是否 方法 内置 | 更新日期: 2023-09-27 18:32:13

我知道我可以通过扩展来做到这一点(我用StringBuilder这样做),但是只要我需要它,我觉得必须有更好的方法。假设我正在组合名字和姓氏,其中任何一个都可能丢失(null 或空,不在乎),如果两者都存在,我只想要一个空格。所以

return firstName + (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName) ? " " : string.Empty) + lastName;

给了我Joe Smith,但从不Joe[trailingspace][leadingspace]Smith.

显然这是一个愚蠢的例子,但我在现实世界中经常这样做。有什么更好的主意吗?

编辑:不要建议String.Join。它不起作用。(好吧,除非您将它与 LINQ 结合使用,就像下面 spender 所做的那样。

C# 中是否有一个优雅/内置的方法来添加字符串连接器 IFF 两个字符串的长度> 0

我会选择这样的东西:

public static string JoinNonEmpty(string separator, params string[] values)
{
    return 
        string.Join(separator, values.Where(v => !string.IsNullOrEmpty(v)));
}

从这个博客 String.Join 方法?,你可以创建一个接受数组和分隔符的扩展方法?:

string[] input = {"Joe", null, "Smith"};
return input.Aggregate((x,y)=>String.IsNullOrEmpty(y)?x :String.Concat(x, " ", y));

我个人会使用字符串。格式():

var myName = string.Format( "{0}{1}{2}"
                           , firstName
                           , !string.IsNullEmptyOrwhitespace(firstName) && !string.IsNullEmptyOrWhitespace(lastName) ? " " : string.empty
                           , lastName
                           ); 

这不是依赖于 LINQ 或扩展方法的聪明代码,它是一种标准、基本和直接的方法 - 重要的是,您可以立即看到正在发生的事情以及结果应该是什么。如果您希望在许多不同的地方执行相同的操作,则使用扩展方法变得更加相关。

或者,数据对象可以封装以下逻辑:

public class MyData
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName
    {
        get { /*insert the string.Format() illustrated above */ }
    }
}