【问题标题】:Adding spaces between strings在字符串之间添加空格
【发布时间】:2008-10-12 00:52:18
【问题描述】:

在字符串之间添加空格的最佳方法是什么

myString = string.Concat("a"," ","b")

myString = string.Concat("a",Chr(9),"b")

我正在使用 stringbuilder 构建 XML 文件并寻找有效的东西。

谢谢

编辑 ~ 语言 VB.NET

【问题讨论】:

  • 在查询中指定语言怎么样?
  • 我假设是 VB,因为他们使用的是 VB 函数 Chr。

标签: .net xml vb.net string


【解决方案1】:

使用 XmlDocument 类创建您的 XML 文件。您浪费时间从头开始创建字符串。

【讨论】:

  • 可能不是 XmlDocument,而是来自 System.Xml 命名空间或相关的 something:XmlWriter、Dataset.WriteXml() 等。
  • 完全同意您最好使用 XmlTextWriter 或 XmlDocument。不要重新发明轮子。
  • 这取决于 XML 文档的“大小”,但总的来说,我认为这应该是公认的答案。除非您有充分的理由不这样做,否则请在您的语言中使用内置的 XML 生成工具!
【解决方案2】:

String.Join 是一个静态方法,可以采用分隔符(在本例中为“”)和字符串数组。

string sentence = String.Join(" ", new string[] { "The", "quick", "brown", "fox" });

【讨论】:

  • 在这种情况下,他的字符串变量,不是一个字符串,而是一个StringBuilder。对于尚未完成且将继续增长的大字符串,这将比 String.Join() 效率
  • 噢,噢,但是你必须分配一个数组。 :-(
  • 我认为数组的额外分配是无关紧要的,因为 string.Concat(Object[] param) 无论如何都会在调用该方法之前创建一个数组。如果要连接的字符串超过 2 个且中间有空格,则 String.Join 将是最佳选择。
  • StringBuilder 没有 Concat 方法吗?
【解决方案3】:

嗯,首先,chr(9) 是一个制表符 - 你会想要使用 chr(32) 来获得一个空格。

也就是说,第一个选项 string.Concat("a"," ","b") 更具可读性。我将专注于让您的代码在功能上正确开始。优化应该始终是最后一步,并且只针对那些需要它的领域。换句话说,您需要一个基准来检查您的优化。

太多次,您优化然后发现自己不得不更改代码,这意味着您的优化工作被浪费了。

【讨论】:

    【解决方案4】:

    绝对不是 Chr(9)。毕竟,不是每个人都使用 ascii。

    【讨论】:

    • chr(9) 在 ASCII 和 Unicode 中是相同的(我相信提问者的意思是 chr(32))。
    • @Pax:但我们不要忘记 EBCDIC。
    • @James:这并没有你想象的那么有趣——我在仍然使用 EBCDIC 的 System z 大型机上做了很多工作。他们的 UNIX 系统服务是可憎的(EBCDIC 在封面和 RACF 而不是 /etc/passwd);哦,好吧,至少他们有 zLinux。
    【解决方案5】:

    作为“传统”XMLDocument 的替代方案,如果您使用的是 .NET 3.5 及更高版本,请查看 LINQ 中的新 XDocument / XElement 类。

    这里有一个很好的教程:

    http://www.hookedonlinq.com/Print.aspx?Page=LINQtoXML5MinuteOverview

    【讨论】:

      【解决方案6】:

      如果您要连接已知数量的字符串,最好只使用 +,因为编译器会将其转换为对 string.Concat 的调用。所以

      s = a + " " + b
      

      变成

      s = string.Concat(a, " ", b)
      

      但第一个更具可读性。尽管通常需要注意,但在循环中执行此操作时,StringBuilders 通常更可取。

      在“”上使用 Chr(32) 不会在速度方面产生任何影响,因为在这种情况下 Chr(x) 是在 VB.Net 的编译时翻译的(不知道它是否总是如此,但在我的机器上它确实如此) 所以你只是让它更难阅读而没有任何好处。 Chr 主要用于向后兼容,通常最好用于定义可打印范围之外的字符。

      也就是说,最好使用其中一个框架库来构建 XML,除非它是一个非常小的片段。

      【讨论】:

      • 我是从数据集中提取的一个小片段。我也同意你的 cmets,虽然我前段时间在某个地方读过,但最好使用 String.Concat。
      • 他们的理由可能是 String.Concat 不会以完全相同的方式遭受字符串不变性的影响。但是,如果你看看编译器产生了什么 a + " " + b 无论如何都会变成 string.Concat 所以它只是归结为更具可读性。
      【解决方案7】:
       Dim TestString As String
      ' Returns a string with 10 spaces.
      TestString = Space(10)
      ' Inserts 10 spaces between two strings.
      TestString = "Hello" & Space(10) & "World"
      

      【讨论】:

        【解决方案8】:

        最简单的方法是使用聚合函数来组合元素。

        string[] input = new string[]{"a", "b"};
        var withSpaces = input.Aggregate( (x,y) => x + " " + );
        

        【讨论】:

          【解决方案9】:

          我看不到问题的代码示例中哪里有字符串生成器;但是既然你说你正在使用一个;我会使用:

          sb.AppendFormat("{0} {1}", a, b);
          

          【讨论】:

          • 字符串(如 string.Concat())是一个变量,而不是一个类型。
          • stringVar.Concat 是一个采用 IEnumerable 的扩展方法。唯一具有与他正在使用的签名匹配的签名的方法是类型字符串上的静态方法 Concat。除非我误会乔尔。