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

C# StringBuilder,如果满足条件,则追加字符串,c#,.net,stringbuilder,C#,.net,Stringbuilder,你知道如何改进吗?如何编写更少的代码,得到相同的结果?这段代码很好。保持这样 每次尝试使用扩展方法或其他方法都只会降低代码的可理解性和可维护性 没有重复代码 只要这些条件不影响其他条件,就没有办法缩短ifs 如果您确实需要其他选项: var sb = new StringBuilder (); if (condition1) sb.Append ("one"); if (condition2) sb.Append ("two"); if (condition3) sb.Append ("t

你知道如何改进吗?如何编写更少的代码,得到相同的结果?

这段代码很好。保持这样

  • 每次尝试使用扩展方法或其他方法都只会降低代码的可理解性和可维护性
  • 没有重复代码
  • 只要这些条件不影响其他条件,就没有办法缩短
    if
    s
如果您确实需要其他选项:

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 ();

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

你可以做一些事情,比如

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

这样更好吗?不。

我更喜欢使用简单DSL定义的方法,因为它使代码更简单或更可读。此外,“管道风格”的表达也很棒。 在您的情况下,可以这样写:

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));
使用扩展方法

var str =
    new StringBuilder()
        .AppendIf(condition1, "one")
        .AppendIf(condition2, "two")
        .AppendIf(condition3, "forty two")
        .ToString();
如果条件重复,这种方法在这里是合适的。例如
arg1!=空
arg2!=空
,则可以使用
AppendIfNotNull


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

另一种方法是使用字符串插值,如本文所述。所以,这个例子可以这样修改。我认为它更容易阅读

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;
    }
}
编辑: 您可以使代码更易于阅读,方法是将其设置为逐字字符串文字

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

这看起来已经很好了。您可能会创建一个扩展方法,类似于
AppendIf(string,bool)
,但不确定这是否是一个改进。如果条件之间没有相互依赖关系,我看不到任何改进的方法但我不确定它是否更好。请注意,这类问题有专门的解决方法。@BhargavModi,如果多个条件为真怎么办?您应该使用
string.Empty
而不是
只是想知道-如果所有条件都为
false
,此代码会导致空字符串而不是空字符串吗?@JamesThorpe:No.
”。字符串串联将始终导致实例化的
字符串
@patrickhoffman谢谢。现在开始调查这是为什么。。。()
var s = $@"{
    (condition1 ? "one": null)
}{
    (condition2 ? "two": null)
}{
    (condition3 ? "three": null)
}{
    (condition4 ? "four": null)
}{
    (condition5 ? "five": null)}";