从使用stringbuilder构建的字符串中删除最后一个字符的最佳方法

时间:2013-06-20 13:34:31

标签: c# stringbuilder

我有以下

data.AppendFormat("{0},",dataToAppend);

这个问题是我在循环中使用它并且会有一个试用逗号。删除尾随逗号的最佳方法是什么?

我是否必须将数据更改为字符串子串呢?

12 个答案:

答案 0 :(得分:185)

最简单且最有效的方式是执行此命令:

data.Length--;

通过执行此操作,您可以将指针(即最后一个索引)移回一个字符,但不会更改对象的可变性。事实上,最好使用StringBuilder清除Length(但为了清晰起见,请务必使用Clear()方法,因为这就是它的实现方式):

data.Length = 0;

再次,因为它不会更改分配表。想想它就像说,我不想再识别这些字节了。现在,即使在调用ToString()时,它也无法识别Length之后的任何内容,嗯,它不能。它是一个可变对象,分配的空间比你提供的空间多,它只是以这种方式构建。

答案 1 :(得分:36)

只需使用

string.Join(",", yourCollection)

这样您就不需要StringBuilder和循环。

答案 2 :(得分:10)

循环后使用以下内容。

.TrimEnd(',')

或只是改为

string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)

答案 3 :(得分:8)

如何...

string str = "The quick brown fox jumps over the lazy dog,";
StringBuilder sb = new StringBuilder(str);
sb.Remove(str.Length - 1, 1);

答案 4 :(得分:6)

我更喜欢操纵stringbuilder的长度:

data.Length = data.Length - 1;

答案 5 :(得分:3)

我建议您更改循环算法:

  • 不是在项目之后添加逗号,而是在之前
  • 使用以false开头的布尔变量,禁止使用第一个逗号
  • 测试后将此布尔变量设置为true

答案 6 :(得分:3)

您应该使用string.Join方法将项​​目集合转换为逗号分隔的字符串。它将确保没有前导或尾随逗号,并确保有效地构造字符串(没有不必要的中间字符串)。

答案 7 :(得分:2)

是的,在循环完成后将其转换为字符串:

String str = data.ToString().TrimEnd(',');

答案 8 :(得分:2)

您有两种选择。第一个是非常容易使用的Remove方法非常有效。第二种方法是将ToString与起始索引和结束索引(MSDN documentation

一起使用

答案 9 :(得分:2)

Similar SO question here.

我喜欢使用StringBuilder扩展方法。

RemoveLast Method

答案 10 :(得分:1)

最简单的方法是使用Join()方法:

public static void Trail()
{
    var list = new List<string> { "lala", "lulu", "lele" };
    var data = string.Join(",", list);
}

如果你真的需要StringBuilder,请在循环后修剪结束逗号:

data.ToString().TrimEnd(',');

答案 11 :(得分:0)

Gotcha !!

如果您使用AppendLine,如下所示,此线程上的大多数答案将无效:

var builder = new StringBuilder();
builder.AppendLine("One,");
builder.Length--; // Won't work
Console.Write(builder.ToString());

builder = new StringBuilder();
builder.AppendLine("One,");
builder.Length += -1; // Won't work
Console.Write(builder.ToString());

builder = new StringBuilder();
builder.AppendLine("One,");
Console.Write(builder.TrimEnd(',')); // Won't work

Fiddle Me

为什么? @ (&**(&@ !!

问题很简单,但花了我一段时间才弄清楚:因为在CRLF的末尾还有两个不可见字符(回车和换行饲料)。因此,您需要带走最后3个字符:

var builder = new StringBuilder();
builder.AppendLine("One,");
builder.Length -= 3; // This will work
Console.WriteLine(builder.ToString());

结论

如果您调用的最后一个方法是Length--,请使用Length -= 1Append。如果您最后一次调用了Length =- 3,请使用AppendLine