0

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

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

给我Joe Smith,但从来没有Joe[trailingspace]or [leadingspace]Smith

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

编辑:不要建议 String.Join。它不起作用。(好吧,除非你将它与 LINQ 结合起来,就像下面的花费者所做的那样。)

4

3 回答 3

3

我会选择类似的东西:

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

}
于 2012-04-25T00:57:42.257 回答
1

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

string[] input = {"Joe", null, "Smith"};
return input.Aggregate((x,y)=>String.IsNullOrEmpty(y)?x :String.Concat(x, " ", y));
于 2012-04-25T00:47:43.337 回答
0

我个人会使用 string.Format():

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 */ }
    }
}
于 2012-04-25T00:59:30.913 回答