在添加到StringBuilder的字符串上循环
本文关键字:字符串 循环 StringBuilder 添加 | 更新日期: 2023-09-27 18:00:48
我有以下代码:
StringBuilder sb = new StringBuilder();
sb.Append("Ola");
sb.Append("Jola");
sb.Append("Zosia");
我可以使用for
或foreach
迭代StringBuilder
对象吗?
我可以显示其中的一个元素吗?例如Console.WriteLine(sb[0]);
不起作用。
您似乎在寻找一个List<string>
,您可以通过索引(list[n]
(和迭代(foreach (string s in list)
(获得Add()
字符串。
StringBuilder
不支持这一点,因为它在内部连接所有输入,之后无法区分不同Append()
调用的值。
要从字符串列表中获取连接字符串,请参阅将列表项附加到StringBuilder。
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);
}
sb.Append
方法只是像键入"text"+"其他一些文本"一样连接字符串,但在效率方面效果要好得多。事实上,每个"s1"+"s2"都会产生一个新字符串。如果你想做1000次这样的操作,它会一次又一次地创建新的字符串,并有很多额外的操作要做。StringBuilder提供了一种避免这种情况的方法,当它"渲染"字符串时,它会更新同一个字符串,而不是每次都创建新的距离。
如果你真的想使用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];
我知道现在回答这个问题已经太晚了,但我希望其他人能从中得到帮助。
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);
}
通过使用这篇文章作为指导,我能够为一个非常相似的场景找到一个可行的解决方案:
替换字符串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]);
}