我正在使用StringBuilder对电子邮件进行简单格式化,并且代码如下所示.
StringBuilder message = new StringBuilder();
message.append("Name: " + model.getName() + "\r\n");
message.append("Organization: " + model.getOrganization() +"\r\n");
message.append("Comment: " + model.getComment() +"\r\n");
contactMessage.setMessage(message.toString());
我正在记录格式并且它正常工作,但是当我们实际检查发送的电子邮件时,它会以一行形式出现.
如果我不使用HTML会怎么样?这是我真正的问题...感谢您的帮助.
所以我主要是C#和Java开发人员,但我想这个问题可能适用于使用StringBuilder或其衍生物的任何编程语言.
好的,所以或多或少的常识,连接即使少量的字符串也可能是主要的性能杀手(尽管这是有争议的).我的问题是,是否有人知道在字符串生成器中使用字符串生成器的性能影响.为了澄清我的意思,让我加入一些虚拟代码来帮助说明我的观点.
此外,我意识到通过调用StringBuilder的多个实例自然会有性能损失但我不相信我会调用它足以导致任何真正的性能问题.(这个假设也可能是错误的,任何意见也会有所帮助)
public string StringToGet()
{
StringBuilder sb = new StringBuilder("Some Text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append(MethodThatCreatesAnotherString());
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append("more text to add");
sb.append(MethodThatCreatesAnotherString());
sb.append("more text to add");
sb.append("more text to …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用StringBuilder和检查字符串是否是回文reverse()。对于没有对称性的单词(如“ chan”),它会正确返回false,但false对于诸如“女士”(madam)之类的真正回文词也将返回。
码:
StringBuilder str = new StringBuilder("madam");
StringBuilder str2 = new StringBuilder(str);
boolean res = str2.equals(str.reverse().toString().trim());
System.out.println(str + " " + str2);
System.out.println(res);
Run Code Online (Sandbox Code Playgroud)
输出:
madam madam
false
Run Code Online (Sandbox Code Playgroud)
我正在使用Java 8运行Eclipse Neon。
我正在开发一个ASP.NET Web应用程序,我一直在遇到同样的问题:
有时我想从代码隐藏中将HTML写入页面.例如,我有一个页面,Editor.aspx,输出根据GET变量的值"视图"而变化.换句话说,"Editor.aspx?view = apples"输出的HTML不同于"Editor.aspx?view = oranges".
我目前用StringBuilder输出这个HTML.例如,如果我想创建一个列表,我可能会使用以下语法:
myStringBuilder.AppendLine("<ul id=\"editor-menu\">");
myStringBuilder.AppendLine("<li>List Item 1</li>");
myStringBuilder.AppendLine("</ul>");
Run Code Online (Sandbox Code Playgroud)
问题是我宁愿使用ASP.NET的List控件来实现这个目的,因为几行StringBuilder语法妨碍了我的代码的可读性.但是,ASP.NET控件倾向于输出复杂的HTML,具有唯一的ID,内联样式以及偶尔的内联JavaScript块.
我的问题是,是否有一个ASP.NET控件只代表一个通用的HTML标签?换句话说,是否存在类似以下示例的控件:
HTMLTagControl list = new HTMLTagControl("ul");
list.ID = "editor-menu";
HTMLTagControl listItem = new HTMLTagControl("li");
listItem.Text = "List Item 1";
list.AppendChild(listItem);
Run Code Online (Sandbox Code Playgroud)
我知道有包装器等等,但我宁愿从简化开始,而不是驯服ASP.NET的复杂性.
在c#中,我们正在为NHibernate构建一个包含"in语句"的查询.表达式的数量超过5000.如果我执行查询,我会收到错误.
我需要找到一种方法来打破大型字符串构建器并将它们存储在字符串构建器数组中,并在需要时执行多个查询以获得所需的输出.我们只有一个帐户拥有超过5000条记录,其余的都低于100.有人可以提出解决方法吗?
所有,
为什么建议将StringBuffer/ StringBuilderobject的大小初始化为2 ^ {1 ... n}的大小(尽管通常它将> 64).这样做会有什么优势/优化?
(注意:虽然我想了解 .Net 4.0 的未来想法,但该项目仅限于 .Net 3.5。)
我有一个线程,它从外部设备异步读取数据(在代码示例中由非常有创意的 strSomeData 模拟:-)并将其存储在 StringBuilder“缓冲区”中(strBuilderBuffer :-)
在“主代码”中,我想“蚕食”这个“缓冲区”。但是,从“操作”的角度来看,我不确定如何以线程安全的方式执行此操作。我理解从“数据”角度来看它是安全的,因为根据 msdn,“此 ( StringBuilder) 类型的任何公共静态成员都是线程安全的。任何实例成员都不能保证是线程安全的。” 但是,我下面的代码说明从“操作”角度来看它可能不是线程安全的。
关键是我担心两行代码:
string strCurrentBuffer = ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.ToString();
// Thread 'randomly' slept due to 'inconvenient' comp resource scheduling...
ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.Length = 0;
Run Code Online (Sandbox Code Playgroud)
如果计算机操作系统在缓冲区的“读取”和缓冲区的“清除”之间让我的线程休眠,我可能会丢失数据(这很糟糕:-(
有没有办法保证“原子性”?这两行并强制计算机不中断它们?
关于弗拉德下面关于使用 的建议lock,我尝试过,但没有成功(真的):
public void BufferAnalyze()
{
String strCurrentBuffer;
lock (ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer)
{
strCurrentBuffer = ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.ToString();
Console.WriteLine("[BufferAnalyze()] ||<< Thread 'Randomly' Slept due to comp resource scheduling");
Thread.Sleep(1000); // Simulate poor timing of thread resourcing...
ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.Length = 0;
}
Console.WriteLine("[BufferAnalyze()]\r\nstrCurrentBuffer[{0}] == {1}", strCurrentBuffer.Length.ToString(), …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些数字附加到字符串中,该字符串已经包含波斯字符,并且StringBuilder始终将波斯语数字附加到字符串中.
StringBuilder sb = new StringBuilder();
sb.Append( other things );
sb.Append("', '");
sb.Append("1234234");
sb.Append("', ");
Run Code Online (Sandbox Code Playgroud)
即使我在上面的代码中明确使用英文数字,我仍然最终得到波斯数字.如何将英文数字附加到此字符串?
UPDATE
这些行模拟了我的问题,您可以通过跟踪此代码来查看波斯语数字:
StringBuilder temp = new StringBuilder();
temp.Append("INSERT INTO [db] (....) VALUES ('21211221', 111555,
'2015/12/12', '??? ???????? ', '???? ???? ????");
temp.Append("', '");
temp.Append("234234");
Run Code Online (Sandbox Code Playgroud)
最后一个附加应该是英文编号,但事实并非如此.
我需要在开头插入字符串.现在我StringBuilder.Insert(0, stringToInsert)用来插入前面,但它需要花费很多时间(大约2分钟,80,000个字符串).
该append()方法运行速度更快(80,000个字符串为30秒),但这不是我需要的顺序.如何反转字符串的顺序(而不是字符串本身)并减少插入时间?
我正在测试Strings,我提出了以下代码:
public static void main(String[] args){
StringBuilder sb1 = new StringBuilder("Cuba");
String str1 = sb1.toString();
// n1
System.out.println(str1 == str2);
}
Run Code Online (Sandbox Code Playgroud)
在n1如果我把:
String str2 = sb1.toString();
Run Code Online (Sandbox Code Playgroud)
我得到false.但是,如果我放置:
String str2 = str1;
Run Code Online (Sandbox Code Playgroud)
我得到true.
我不确定为什么会发生这种情况:两个代码都指的是同一个实例,因此,两个输出必须是true.
知道为什么两个输出都不同吗?我知道如何比较字符串,我只是对结果不同的原因感到好奇.