我想创建一个错误消息字符串。它应包含多个提示以纠正错误。
首先,我创建了类似的内容
string errorMessage = string.Empty;
if (1 == 1)
errorMessage += "- hint 1\n";
if (2 == 2)
errorMessage += "- hint 2\n";
if (3 == 3)
errorMessage += "- hint 3";
// do something with errorMessage
我想清理一下。我创建了扩展方法
public static void AppendIf(this string s, bool condition, string txtToAppend)
{
if (condition)
s += txtToAppend;
}
在我班上叫它
string errorMessage = string.Empty;
errorMessage.AppendIf(1 == 1, "- hint 1\n");
errorMessage.AppendIf(2 == 2, "- hint 2\n");
errorMessage.AppendIf(3 == 3, "- hint 3");
// do something with errorMessage
但是errorMessage
保持为空。我以为this
的行为就像ref
关键字,所以我的扩展方法出了什么问题?
答案 0 :(得分:4)
string
是不可变的,这意味着它每次您添加到它时都会创建一个新字符串,因此这是不可能的。
但是,您可以使用StringBuilder
来实现:
public static class StringBuilderExtensions
{
public static StringBuilder AppendLineIf(this StringBuilder builder, bool condition, string line)
{
// validate arguments
if (condition)
builder.AppendLine(line);
return builder;
}
public static StringBuilder AppendIf(this StringBuilder builder, bool condition, string line)
{
// validate arguments
if (condition)
builder.Append(line);
return builder;
}
}
StringBuilder builder = new StringBuilder();
builder.AppendLineIf(1 == 1, "- hint 1");
builder.AppendLineIf(2 == 2, "- hint 2");
builder.AppendLineIf(3 == 3, "- hint 3");
string result = builder.ToString();
// do something with result
如果您觉得更好,也可以链接这些呼叫:
string result = new StringBuilder()
.AppendLineIf(1 == 1, "- hint 1")
.AppendLineIf(2 == 2, "- hint 2")
.AppendLineIf(3 == 3, "- hint 3")
.ToString();
答案 1 :(得分:2)
您无法使用this ref
修饰符,请检查compiler feature request。
但是,通过使用StringBuilder
类型,您可以获得相同的结果:
public static void AppendIf(this StringBuilder s, bool condition, string txtToAppend)
{
if (condition)
s.Append(txtToAppend);
}
因此,您的代码将是:
string errorMessage = new StringBuilder();
errorMessage.AppendIf(1 == 1, "- hint 1\n");
errorMessage.AppendIf(2 == 2, "- hint 2\n");
errorMessage.AppendIf(3 == 3, "- hint 3");
NB:请避免在循环内执行类似str += anotherStr;
的代码,因为此方法的复杂度为O(N ^ 2),其中N为字符数。请检查this question中的详细信息。