C# 在stringbuilder类型上正确使用子字符串

C# 在stringbuilder类型上正确使用子字符串,c#,C#,我正在使用子字符串建立一个数据字符串。我想要的数据格式是 [1,2,3,4,5,6,7,8,9,10] 因此,我将其构建如下 StringBuilder sb = new StringBuilder(); sb.append("1,"); sb.append("2,"); sb.append("3,"); . . . 我遇到的问题是,我想在添加结束语之前修剪最后的, 我可以 sb.ToString(); sb.Substring(0, (sb.Length - 1)); sb += "]";

我正在使用子字符串建立一个数据字符串。我想要的数据格式是

[1,2,3,4,5,6,7,8,9,10]
因此,我将其构建如下

StringBuilder sb = new StringBuilder();
sb.append("1,");
sb.append("2,");
sb.append("3,");
.
.
.
我遇到的问题是,我想在添加结束语之前修剪最后的

我可以

sb.ToString();
sb.Substring(0, (sb.Length - 1));
sb += "]";

但是使用+=不是很有效,因为这会创建一个新字符串。有更好的方法吗?

最简单的方法是在
StringBuilder
上使用
-=
,因为它是可写的:

var str = "[" + String.Join(", ",Enumerable.Range(1,10)) + "]";
sb.Length -= 1; // removes the last char

更新

经过一点测试

var result = string.Concat("[", string.Join(",", someEnumerable), "]");
比构建器方法更简单、更快


你可以一直这样做

var result = string.Format("[{0}]", string.Join(",", someEnumerable));
例如,序列可以是您想要的任何内容

var someEnumerable = Enumerable.Range(1, 10);
这似乎比重新发明轮子更简单,并且避免了中间串

这确实对
String.Join的实现做出了假设,但是,我认为您应该假设它已经足够好了


有关详细信息,请对
String.Join
StringBuilder
进行比较


表示
String.Format
使用
StringBuilder
如果不需要,则不添加最终的

var sb = new StringBuilder().Append('[');
var first = true;
foreach (var item in collection)
{
    if (first)
        first = false;
    else
        sb.Append(',');
    sb.Append(item);
}
sb.Append(']');
var result = sb.ToString();

下面是一个很好的干净方法示例:

    public static string WriteValues(int start, int end)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("[");
        for (int index = start; index <= end; index++)
        {
            sb.Append(index).Append(",");
        }
        sb.Length -= 1;
        sb.Append("]");
        return sb.ToString();
    }
公共静态字符串writeValue(int-start,int-end)
{
StringBuilder sb=新的StringBuilder();
某人加上(“[”);


对于(int index=start;index和左括号如何?
var result=string.Concat(“[”,string.Join(“,”,someEnumerable),“]));
StringBuilder
方法快一点,也简单得多,我已经测试过了。但这不是OP所要求的,因为它创建了新字符串,而且也不清楚OP是否只需要1到10之间的整数,即使它是示例数据。谢谢你,我从来都不知道你可以用link来做这件事。它需要一个re-w这是我的代码的一种形式,所以我现在不使用它,但它对未来有好处@L.BI喜欢这种方法,即使它由于创建了几个字符串而没有特别的性能价值。@WesleySkeen,你可以在一行中完成它,当然没有linq,只需使用
String.Format
,就像我的回答一样。这不是关于
+=
?@Jo的问题吗德雷尔:我不确定,因为标题提到“正确使用子字符串”和“我遇到的问题是,在添加结束符之前,我想修剪决赛]”。这可能需要检查
“[]”
是一个有效的结果。否则,开头的括号可能会被删除。设置
.Length
会将StringBuilder缓冲区的内容复制到另一个新创建的数组中,这与
子字符串
的方法没有太大区别,因此肯定效率不高。请尝试@dtb的答案。@ssg:仅当缓冲区对于新的长度来说不够大时gth。如果长度减少,则不会出现这种情况。这是最正确的建议,但代码是错误的。您必须检查最后一个,而不是第一个。@ssg:除了第一个元素之外,我在每个元素之前都添加了逗号。为什么错了?@dtb我以为您在后面添加了逗号,对不起,我的错。那么这就是正确的答案。@dtb这是正确的答案。@dtb这是正确的答案wer.很抱歉我的初始解释错误:)+1ed:)
string.Format(“[{0}]”,string.Join(“,”,collection));
在一行中实现了相同的效果。虽然不是我被否决,但代码不起作用。它应该是string.Join(“,”,someEnumerable));我也不知道这是否在幕后创建了多个字符串。@activwerx,doh,修复了ommited参数。你是对的,我也不知道
String.Join
是如何实现的,但我应该假设它的提供是有原因的。我已经删除了否决票,因为我认为这是一个很好的实现!:-)
Any c反对选民吗?
当你知道自己为什么这么做时,这听起来太大胆了。编辑错误的答案,然后发问,什么都掩盖不了。所以这很透明。当我还是反对选民时,我现在就把它删除了。