字符串生成器,如果满足条件,则附加字符串

本文关键字:字符串 条件 如果 满足 | 更新日期: 2023-09-27 18:34:53

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

知道如何改进它吗?如何编写更少的代码,给出相同的结果?

字符串生成器,如果满足条件,则附加字符串

这段代码很好。保持这样。

  • 每次尝试使用扩展方法或其他方法只会使此代码更难理解和维护;
  • 没有重复的代码;
  • 只要条件不影响另一个条件,就没有办法缩短if

如果您确实想要其他选项:

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

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

我更喜欢使用简单的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 != nullarg2 != null,则可以使用AppendIfNotNull

否则,请

三思而后行,因为它看起来与初始实现非常相似,需要额外的代码,由于额外的 null 检查和方法调用可能会变慢,并且您应该为每个Append创建一个重载AppendIf

你可以

做这样的事情,

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

这样更好吗?不。

另一种方法是使用字符串插值,如此处 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)}";