我有以下代码:
StringBuilder sb = new StringBuilder();
sb.Append("Ola");
sb.Append("Jola");
sb.Append("Zosia");
我可以使用StringBuilder
或for
迭代foreach
对象吗?
我可以显示它的一个元素吗?例如
Console.WriteLine(sb[0]);
不起作用。
答案 0 :(得分:3)
您似乎正在寻找List<string>
,您可以Add()
向其提供以后可以通过索引(list[n]
)获取的字符串并迭代(foreach (string s in list)
)
StringBuilder
不支持这一点,因为它在内部连接所有输入,之后无法区分不同Append()
次调用的值。
要从字符串列表中获取连接字符串,请参阅Append List items to StringBuilder。
答案 1 :(得分:1)
StringBuilder不是集合或数组。它只是一个提供一些额外功能来使用字符串的类。它没有实现IEnumerable接口。
如果你输入“text”+“some some text”, sb.Append
方法只是像你一样连接字符串,但在效率方面要好得多。事实上,每个“s1”+“s2”都会导致创建新的字符串。如果你想这样做1000次,那么它会一次又一次地创建新的字符串,需要做很多额外的操作。 StringBuilder提供了一种避免它的方法,当它“渲染”字符串时,它会更新相同的字符串,而不是每次都创建新的字符串。
答案 2 :(得分:1)
StringBuilder
没有实现IEnumerable
,因此您无法foreach
覆盖它,但您可以执行以下操作:
StringBuilder sb = new StringBuilder();
sb.Append("Ola");
sb.Append("Jola");
sb.Append("Zosia");
for (int i = 0; i < sb.Length; i++)
{
char c = sb[i];
if (Char.IsUpper(c)) Console.Write('\n');
Console.Write(c);
}
答案 3 :(得分:0)
如果您真的想坚持使用StringBuilder,可以使用扩展方法为您提供List,然后您可以使用元素编号访问它。
internal static class ExtensionMethods
{
public static List<string> ToList(this StringBuilder stringBuilder)
{
return stringBuilder.ToString().Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList();
}
}
然后,您可以通过调用ToList()方法来访问它。
int i = 0;
StringBuilder SB = new StringBuilder();
while (i++ != 1000000)
{
SB.AppendLine(i.ToString());
}
string ChosenElement = SB.ToList()[1000];
答案 4 :(得分:0)
我知道回答这个问题为时已晚,但我希望其他人能从中获得帮助。
public static void Main(string[] args)
{
StringBuilder sb = new StringBuilder("1");
for(int i=2; i<= 300; i++){
sb.Append(i+" this is test.~");
}
foreach(string s in sb.ToString().Split('~')){
Console.WriteLine(s);
}
}
编辑: 在你的例子中:
StringBuilder sb = new StringBuilder();
sb.Append("Ola~");
sb.Append("Jola~");
sb.Append("Zosia~");
//foreach loop ver sb object
foreach(string s in sb.ToString().Split('~')){
Console.WriteLine(s);
}
答案 5 :(得分:0)
通过使用此帖子作为指导,我能够针对非常相似的情况获得可行的解决方案:
Replace Line Breaks in a String C#
如果您能够使用sb.AppendLine,则可以通过换行符'\ r'和'\ n'拆分结果ToString()
// e.g whereas you had:
StringBuilder sb = new StringBuilder();
sb.Append("Ola");
sb.Append("Jola");
sb.Append("Zosia");
// the scenario will only work if you did the following:
StringBuilder sb = new StringBuilder();
sb.AppendLine("Ola");
sb.AppendLine("Jola");
sb.AppendLine("Zosia");
// you can split your strings as follows:
string[] resultLines = TestResultStr.ToString().Split(new char[] { '\n', '\r' });
for (int i = 0; i < resultLines.Length; i++)
{
Console.WriteLine(resultLines[i]);
}