【问题标题】:using substring properly on a stringbuilder type在 stringbuilder 类型上正确使用子字符串
【发布时间】:2012-10-31 18:14:16
【问题描述】:

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

[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 += "]";

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

【问题讨论】:

  • 那么左括号呢?
  • var result = string.Concat("[", string.Join(",", someEnumerable), "]");StringBuilder 方法快一点,而且简单得多,我已经测试过了。

标签: c#


【解决方案1】:

更新

经过一番测试

var result = string.Concat("[", string.Join(",", someEnumerable), "]");

比构建器方法更简单更快


你总是可以这样做

var result = string.Format("[{0}]", string.Join(",", someEnumerable));

序列可以是任何你想要的,例如

var someEnumerable = Enumerable.Range(1, 10);

这似乎比重新发明轮子更简单,并且避免了中间字符串。

这确实对String.Join 的实现做出了假设,但是我认为你应该假设它对于这个目的来说已经足够好了。


如需了解更多信息,this Question 会比较 String.JoinStringBuilder

This Question 表示String.Format 使用StringBuilder

【讨论】:

  • 虽然不是我投反对票,但代码不起作用。应该是 string.Join(",", someEnumerable));
  • 另外我不知道这是否在幕后创建了多个字符串。
  • @activwerx,doh,修复了省略的参数。你说得对,我也不知道String.Join 是如何实现的,但我应该假设它的提供是有原因的。
  • 好吧,我删除了反对票,因为我认为这是一个很好的实现! :-)
  • Any comments downvoters? 当您知道自己为何如此时,这听起来如此大胆。编辑一个错误的答案,然后回问掩盖什么。 SO是如此透明。虽然我是一个反对者,但我现在删除了它。
【解决方案2】:

这是一个很好的清洁方法示例:

    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();
    }

这会在 StringBuilder 中完成所有工作,然后传回单个字符串。您还可以指定开始和结束值!

【讨论】:

    【解决方案3】:
    var str = "[" + String.Join(", ",Enumerable.Range(1,10)) + "]";
    

    【讨论】:

    • 但这不是 OP 所要求的,因为它会创建新字符串,而且即使是样本数据,也不清楚 OP 只需要 1 到 10 之间的整数。
    • 谢谢你,我从来不知道你可以用链接做到这一点。它需要重新编写我的代码,所以我现在不会使用它,但它对未来有好处@L.B
    • 我喜欢这种方法,即使由于创建了多个字符串,它的性能并不是特别值得。
    • @WesleySkeen,您当然可以在没有 linq 的情况下在一行中完成,只需使用 String.Format,就像我的回答一样。
    【解决方案4】:

    如果不需要,请不要添加最后的,

    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();
    

    【讨论】:

    • 这是最正确的建议,但代码错误。您必须检查最后一个,而不是第一个。
    • @ssg:除了第一个元素之外,我在每个元素之前添加一个逗号。为什么错了?
    • @dtb 我以为你在后面加了逗号,对不起。那么这就是正确的答案。
    • @dtb 这是正确的答案。对不起我的错误初步解释:) +1ed :)
    • string.Format("[{0}]", string.Join(",", collection)); 在一行中实现了相同的效果。
    【解决方案5】:

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

    sb.Length -= 1; // removes the last char
    

    【讨论】:

    • 不是+=的问题吗?
    • @Jodrell:我不确定,因为标题提到“正确使用子字符串”和“我遇到的问题是当我想在添加结尾 ] 之前修剪最后的 ]”。跨度>
    • 这可能需要检查"[]" 是否为有效结果。否则左括号可能会被删除。
    • 设置 .Length 将 StringBuilder 缓冲区的内容复制到另一个新创建的数组中,它与 Substring 方法没有太大区别,因此绝对没有效率。试试@dtb 的答案。
    • @ssg:仅当缓冲区不足以容纳新长度时。如果长度减少,情况就不是这样了。
    猜你喜欢
    • 2015-04-29
    • 2016-02-16
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多