StringBuilder,如果满足条件则追加字符串

9
var sb = new StringBuilder ();

if (condition1) sb.Append ("one");
if (condition2) sb.Append ("two");
if (condition3) sb.Append ("three");
if (condition4) sb.Append ("four");
if (condition5) sb.Append ("five");

return sb.ToString ();

有什么想法可以改善它?如何写更少的代码,达到相同的结果?

4
看起来已经很好了。你可能可以创建一个扩展方法,类似于 AppendIf(string, bool),但不确定这是否是改进。 - Andrei
如果这些条件之间没有相互依赖,我看不出有什么改进的方法。 - Jodrell
1
你可以使用sb.Append(condition1 ? "One" : "");,但我不确定这样做是否更好。 - 500 - Internal Server Error
2
只是提醒一下,有一个专门处理这类问题的网站:http://codereview.stackexchange.com/。 - James Thorpe
2
@BhargavModi,如果多个条件都为真怎么办? - Jodrell
显示剩余2条评论
4个回答

15

这段代码很好,请保持不变。

  • 每次尝试使用扩展方法或其他方法都会使这段代码更难理解和维护;
  • 没有重复的代码;
  • 只要条件不互相影响,就没有缩短这些if语句的方法。

如果确实需要其他选项:

string s = 
   (condition1 ? "one" : null) + 
   (condition2 ? "two" : null) + 
   (condition3 ? "three" : null) + 
   (condition4 ? "four" : null) + 
   (condition5 ? "five" : null)
   ;

但说实话,这会让情况变得更好吗?不会。


你应该使用 string.Empty 而不是 "" - Jodrell
只是想知道-如果所有条件都为“false”,这段代码会产生一个null字符串而不是空字符串吗? - James Thorpe
2
@JamesThorpe:不会。""。字符串连接始终会导致实例化的string - Patrick Hofman
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - James Thorpe

7

我更喜欢使用简单的DSL定义方法,当它能让代码更简洁或易读时。同时,“管道式”表达式也非常棒。 在你的情况下,可以这样写:

var str =
    new StringBuilder()
        .AppendIf(condition1, "one")
        .AppendIf(condition2, "two")
        .AppendIf(condition3, "forty two")
        .ToString();

使用扩展方法。
public static class StringBuilderExtensions
{
    public static StringBuilder AppendIf(
        this StringBuilder @this,
        bool condition,
        string str)
    {
        if (@this == null)
        {
            throw new ArgumentNullException("this");
        }

        if (condition)
        {
            @this.Append(str);
        }

        return @this;
    }
}

如果条件重复出现,可以使用这种方法。例如 arg1 != null, arg2 != null,那么就可以使用 AppendIfNotNull

否则,要三思而行,因为它看起来与初始实现非常相似,需要额外的代码,可能会因为额外的空值检查和方法调用而变慢,而且你还需要为每个 Append 创建一个 AppendIf 重载。


3
您可以这样做:
var conditions = new[]
    {
        Tuple.Create(condition1, "one"),
        Tuple.Create(condition2, "two"),
        Tuple.Create(condition3, "three"),
        Tuple.Create(condition4, "four"),
        Tuple.Create(condition5, "five"),
    }

return string.Concat(conditions.Where(t => t.Item1).Select(t => t.Item2));

这样好吗?不好。


2

另一种方法是使用字符串插值,就像这里所记录的那样https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated。因此,示例可以修改为以下内容。我认为这样更容易阅读。

var s = $"{(condition1 ? "one": null)}{(condition2 ? "two": null)}{(condition3 ? "three": null)}{(condition4 ? "four": null)}{(condition5 ? "five": null)}";

编辑: 您可以通过使用原样字符串字面量使代码更易于阅读。

var s = $@"{
    (condition1 ? "one": null)
}{
    (condition2 ? "two": null)
}{
    (condition3 ? "three": null)
}{
    (condition4 ? "four": null)
}{
    (condition5 ? "five": null)}";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接