字符串生成器,如果满足条件,则附加字符串
本文关键字:字符串 条件 如果 满足 | 更新日期: 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 != null
、arg2 != 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)}";