我想有条件地将从函数派生的字符串附加到字符串构建器。所需条件是函数不返回空字符串("")。
有条件地附加字符串的目的是避免AppendLine()
在追加的字符串(从函数返回)为空时追加一行。
我当前的代码(将函数包装在调用相同函数的条件中):
Dim builder As New System.Text.StringBuilder()
builder.Append("Some text...").AppendLine()
If Not IsNothing(someFunction(someParameterAA, someParameterAB)) Then
builder.Append(someFunction(someParameterAA, someParameterAB)).AppendLine()
End If
If Not IsNothing(someFunction(someParameterBA, someParameterBB)) Then
builder.Append(someFunction(someParameterBA, someParameterBB)).AppendLine()
End If
builder.AppendLine().Append("...some text.")
Dim s As String = builder.ToString
MessageBox.Show(s)
我希望存在一种更有效的替代方案(在编写代码量方面效率很高)。最后,我想避免两次调用相同的函数,但是我无法独立地将builder.Append
代码行添加到我的函数中。是否可以定位builder.Append
?
潜在逻辑的例子:
If `builder.Append()` inside the following brackets is not an empty string then:
(
builder.Append(someFunction(someParameterAA, someParameterAB)).AppendLine()
)
如果有人对上述方法有解决方案,请记住builder.Append()
行之外的简洁(=< 2)代码行的先决条件。
我可以接受任何其他建议。
答案 0 :(得分:3)
创建另一种方法来执行追加:
CheckBeforeAppend(someFunction(someParameterAA, someParameterAB), builder)
CheckBeforeAppend(someFunction(someParameterBA, someParameterBB), builder)
....
Public Sub CheckBeforeAppend(s As String, sb As StringBuilder)
If Not String.IsNullOrEmpty(s)
sb.Append(s).AppendLine()
End If
End Sub
这样的简单重构缩短了原始代码,意味着您不需要复制函数返回值的空或空检查。
对于扩展方法(将此代码放在Module
中):
<Extension()>
Public Sub CheckBeforeAppend(s As String, sb As StringBuilder)
If Not String.IsNullOrEmpty(s)
sb.Append(s).AppendLine()
End If
End Sub
用法:
someFunction(someParameterAA, someParameterAB).CheckBeforeAppend(sb)
或StringBuilder
上的扩展程序:
<Extension()>
Public Sub CheckBeforeAppend(sb As StringBuilder, s As String)
If Not String.IsNullOrEmpty(s)
sb.Append(s).AppendLine()
End If
End Sub
用法:
builder.CheckBeforeAppend(someFunction(someParameterAA, someParameterAB))
答案 1 :(得分:2)
您可以通过将函数的结果存储在变量中来避免调用该函数。
Dim myString As String = someFunction(someParameterAA, someParameterAB)
If myString <> "" Then
builder.Append(myString).AppendLine()
End If
myString = someFunction(someParameterBA, someParameterBB)
If myString <> "" Then
builder.Append(myString).AppendLine()
End If
这样你只需调用一次函数并用变量检查你的条件。此外,代码看起来更小,更容易理解。