这两种方法有什么区别? 一个比另一个更有效? 我在想,也许appendtext()使用类似于StringBuilder的方法,即它使用自己的缓存而不是每次创建和附加新字符串,这是真的吗? 谢谢. 解决方案 正如 附录方法使用户无需文本串联即可将文本附加到文本控件的内容上,当需要许多串联时,该文本可以产生更好的性能. 您的问题, 这两种方法有什么区别? 我们都知道TextBox.Text += something;如何工作,即每次创建和附加新字符串,但是AppendText的工作方式,我找不到任何代码段 一个比另一个更有效? 我认为上述问题的答案将取决于情况,(基于测试案例观察) 如果 Multiline 属性设置为 false ,然后串联(+=)产生更好的结果,但另一方面 Multiline 属性设置为 true 然后 AppendText 产生更好的性能. edit 阅读 private void btnAppe
以下是关于 stringbuilder 的编程技术问答
我必须使用StringBuilder而不是字符串列表,因为该项目被粘贴了.NET 1.1. 我想写一系列我写给文件的调试消息,以便在我的闲暇时学习,因为在屏幕上有太多可见的消息(MessageBox没有滚动条).编写文件的一些简单方法似乎在.NET 1.1中没有可用.我也无法访问Environment.Newline可以清洁我附加的行(AppendLine在此古代版本的StringBuilder中都不可用). .NET 1.1(C#)中最简单的方法是将StringBuilder的内容写入文件的最简单方法?手持设备上没有" C"驱动器,所以我认为我必须将其写入" \ thereiam.txt"之类的东西. 解决方案 您仍然可以访问StreamWriter: using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"\hereIam.txt")) { file.WriteLine(sb
情况是,我正在将WCF调用到远程服务器上,该服务器返回XML文档作为字符串. 大多数时候,这个回报值是几个K,有时几十个K,偶尔几百K,但很少可能是几个兆字节(第一个问题是我没有办法知道) . 这些罕见的场合引起了悲伤.我得到了启动的堆栈跟踪: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at System.Xml.BufferBuilder.AddBuffer() at System.Xml.BufferBuilder.AppendHelper(Char* pSource, Int32 count) at System.Xml.BufferBuilder.Append(Char[] value, Int32 start, Int32 count) at System.Xml.XmlTextReaderImpl.P
我正在读取数百万行的多个文件中,我正在创建一个具有特定问题的行号的列表.例如,如果特定字段留为空白或包含无效的值. 所以我的问题是,什么是最有效的日期类型,以跟踪可能超过一百万行的数字列表.使用字符串构建器,列表或其他内容会更有效吗? 我的最终目标是输入一条消息,例如"特定字段在1-32、40、45、47、49-51等上.如果只有1个,我将从1到1-2更改它,如果多个以上会通过逗号分开.在列表中,我只会将每个数字添加到列表中,然后组合一次该文件已经完全读取.但是,在这种情况下,我可以拥有包含数百万个数字的多个列表. 这是我使用的当前代码,用于使用字符串构建器组合数字列表: string currentLine = sbCurrentLineNumbers.ToString(); string currentLineSub; StringBuilder subCurrentLine = new StringBuilder(); StringBuilder subC
朋友 我正在使用String Builder来生成乘客列表,其中我使用了一个我想将dlatdownlist添加到此乘客中的表.我做的是我拿了一张主桌子 - strHTML1.Append("
"); strHTML1.Append(""); strHTML1.Append(""); strHTML1.Append("Passenger"); strHTML1.Append(" "); strHTML1.Append("
"); strHTML1.Append(""); strHTML1.Append(""); strHTML1.Append(""); strHTML1.Append("
我在vb.net中为StringBuilder编写了一个扩展程序以添加AppendFormattedLine方法(因此,我不必为新行字符使用其中一个参数): Imports System.Runtime.CompilerServices Public Module sbExtension _ Public Sub AppendFormattedLine(ByVal oStr As System.Text.StringBuilder, _ ByVal format As String, _ ByVal arg0 As Object) oStr.AppendFormat(format, arg0).Append(ControlChars.NewLine) End Sub
在vb.net(或C#)中,我不知道如何将StringBuilder与字符串进行比较.我已经搜索了很多,找不到答案.我必须写自己的例行程序.没有更好的方法吗? 这不起作用: Dim s As String = "abc" Dim sb As New StringBuilder("abc") If sb.Equals(s) Then Console.WriteLine(sb.ToString() + " DOES equal " + s) Else Console.WriteLine(sb.ToString() + " does NOT equal " + s) End If 该代码的结果是: ABC不等于ABC 没有某种方法将StringBuilder与字符串进行比较而不编写我自己的例程吗?我很明显,因为我在任何地方都找不到这个问题. 解决方案 最简单的方法是将StringBuilder的内容作为字符串: If sb.ToString() =
我正在尝试在这里随机化最终结果.这个想法是获取文本框行执行一些代码,然后将其导出到TextBox2,代码工作,但我想在导出到TextBox22 时将行订单随机化. Dim newr As New StringBuilder For Each line In texbox1.text.Lines newr.AppendLine(line & " CODE-DONE-1") newr.AppendLine(line & " CODE-DONE-2") newr.AppendLine(line & " CODE-DONE-3") Next textbox2.text = newr.ToString 'Want to randomize Lines Order 示例 如果我放入textbox1 1 2 3 我想要textbox2 中的输出 3 C
我知道.NET System.Text.StringBuilder in .NET具有AppendLine()方法,但是,我需要将一条线预先付诸实践.我知道您可以使用Insert()附加字符串,但是我似乎无法使用一行,我可以使用下一个行字符吗?我正在使用vb.net,所以最好的答案是可取的,但是C#中的答案也可以. 解决方案 我可以使用下一行字符吗? 您可以使用 Environment.NewLine Environment.NewLine 获取为此环境定义的新线字符串. 例如: StringBuilder sb = new StringBuilder(); sb.AppendLine("bla bla bla.."); sb.Insert(0, Environment.NewLine); 甚至更好,您可以为此编写一个简单的扩展方法: public static class MyExtensions { public static S
我有一个名为stb_Swap_Tabu的A StringBuilder用于存储课程的名称, 我正在使用以下方法来查找课程: stb_Swap_Tabu.ToString.Contains("CourseName") 就我而言,性能是最重要的问题. 有更快的方法吗? 解决方案 StringBuilder并非真正用于所有字符串目的.如果您确实需要搜索一个,则必须编写自己的方法. 有几种适合不同情况的字符串搜索算法. 以下是Knuth-Morris-Pratt算法的简单实现,该算法仅关心序数匹配(没有案例折叠,没有与培养有关的整理,只是对编码匹配的简单编码点).它具有一些初始Θ(m)顶部,其中m是寻求单词的长度,然后在Θ(n)中找到n是与所寻求的单词的距离,或者是整个字符串构建器的长度不在.这击败了简单的char-char比较,即Θ((n-m+1) m)(其中O()符号描述上限,Θ()描述了上限和下限). 这都说,听起来确实像创建列表可能是手头任务的更好方法
可能的重复: string vs stringBuilder 我只是重新审视了我曾经拿起vb.net的一些书.我不确定我已经脑子里有这个,了解什么是/什么是StringBuilder. 使用什么指南?如果您是串联2个字符串或50个? ,最好使用它吗? 或当总字符串长度大于128个字符时? ,或者每当您使用它将字符串添加在一起时,您都会看到性能好处? 在哪种情况下,使用StringBuilder实例构建SQL语句比string.format("Select * from x where y = {0}",1)更好? 总是让我感到震惊的是,宣布另一个变量并包括一个名称空间对小字符串串联无益,但我现在不确定. 对不起,大量文档告诉您使用什么,不是最好的. 解决方案 我有一个有关此主题的文章.总结(从页面底部复制): 当您在非平凡的环路中加入时,肯定会使用StringBuilder-尤其是如果您不确定(在编译时)您通过循环进行了多少次迭代.
假设我在C#中有一个StringBuilder,可以做到这一点: StringBuilder sb = new StringBuilder(); string cat = "cat"; sb.Append("the ").Append(cat).(" in the hat"); string s = sb.ToString(); 这会像具有: 一样高效或更有效 string cat = "cat"; string s = String.Format("The {0} in the hat", cat); 如果是这样,为什么? 编辑 经过一些有趣的答案,我意识到我可能应该在问的问题上有些清楚.我并不是在问哪个在串联时更快,但是在 上更快地注入 一个字符串. 在上面的两种情况下,我都想将一个或多个字符串注入预定义模板字符串的中间. 对不起,混乱 解决方案 注意:当当前版本是.NET 2.0时,此答案是编写的.这可能不再适用于以后的版本.
如何将字节订单标记添加到StringBuilder? (我必须将字符串传递给另一种将其保存为文件的方法,但我无法修改该方法). 我尝试了: var sb = new StringBuilder(); sb.Append('\xEF'); sb.Append('\xBB'); sb.Append('\xBF'); 但是,当我使用十六进制编辑器查看它时,它添加了以下顺序: C3 AF C2 BB C2 BF 字符串很大,所以最好不要来回转换为字节数组. 编辑: 在评论中澄清问题.我必须将字符串传递到另一个使用字符串并在Azure Blob存储上创建文件的方法.我无法修改其他方法. 解决方案 两个选项: 在您的文本中不包括字节订单标记 ...而不是使用编码,该编码会自动包含 在您的StringBuilder中将其添加为字符: sb.Append('\uFEFF'); // U+FEFF is the byte-order mark char
我有一个tasks列表对象,我要迭代并将每个任务对象附加到StringBuilder中,然后是新行,如下所示.现在,我将在同一字符串构建器中保持附加任务对象,直到达到60000字节的尺寸限制为止.一旦达到限制,我将将此字符串作为映射中的值填充,键将是带有增量索引的文件名.然后我将重置字符串构建器和其他内容,然后再次重复此过程. 所以,如果我有一个大tasks对象,那么我将分为多个字符串对象,其大小应始终小于60000字节. 我得到的代码下方,但我总是看到地图中的值大于60000字节.我做错了什么?另外,我在两个不同的地方填充HashMap - 一个如果达到限制,另一个是未达到限制. public void populate(final List tasks) { Map holder = new HashMap(); int size = 0; int index = 0; String
以下代码的输出是"测试通过";有人可以向我解释为什么? public class Test { public static void main(String args[]) { System.out.println(new Test().print()); } protected StringBuilder print() { StringBuilder builder = new StringBuilder(); try { builder.append("Test "); return builder.append("Passed!!!"); } finally { builder = null; } } 解决方案 基本上,Java的作用是: StringBuilder valueToReturn = b
我正在研究一个项目,在该项目中我必须从PHP服务器解密XML文本并将其解析为Java,我已经使用CipherInputStream解密了XML文本,并完全打印了XML文件,但是我面对的是一个试图将XML文本存储在Java字符串中时,我正在处理以下代码: public String decrypt(InputStream Fis){ Cipher c = Cipher.getInstance(algo + "/CBC/NoPadding"); String add = ""; StringBuilder getAns = new StringBuilder(); c.init(Cipher.DECRYPT_MODE, key); CipherInputStream cis = new CipherInputStream(Fis , c); byte[] encData = new byte[16]; int dummy; while ((dummy = cis.rea
我清楚地记得,从.NET的早期开始,该NET将toString调用在用于提供新的字符串对象(待返回)的StringBuilder上,并使用StringBuilder使用的内部char缓冲区.这样,如果您使用StringBuilder构造了一个巨大的字符串,则调用ToString不必复制它. 这样做,StringBuilder必须防止对缓冲区的任何其他更改,因为现在它已被不变的字符串使用.结果,StringBuilder将切换到任何尝试更改首先创建新的缓冲区的"复制变更",然后将旧缓冲区的内容复制到它,然后更改. > 我认为,假设StringBuilder将用于构造字符串,然后转换为常规字符串并丢弃.对我来说似乎是一个合理的假设. 现在是事情.我在文档中找不到任何提及.但是我不确定它是否已记录下来. 所以我查看了使用反射器(.NET 4.0)的ToString的实现,在我看来,它实际上复制了字符串,而不仅仅是共享缓冲区: [SecuritySafeCriti