循环遍历添加到StringBuilder的字符串

时间:2015-07-01 10:42:24

标签: c# stringbuilder

我有以下代码:

StringBuilder sb = new StringBuilder();
sb.Append("Ola");
sb.Append("Jola");
sb.Append("Zosia");

我可以使用StringBuilderfor迭代foreach对象吗?

我可以显示它的一个元素吗?例如 Console.WriteLine(sb[0]);不起作用。

6 个答案:

答案 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]);
}