编辑2
好的,我在gist.github上发布了我的源代码副本,我只有一个我无法解决的挥之不去的问题.
FindLine()总是返回-1.我已将原因缩小到if语句,但我无法弄清楚原因.我知道symbol和symbolList都传递了良好的数据.
/编辑2
我有一个相当简单的C#程序,它查找.csv文件,读取该文件中的文本,重新格式化它(并包含加载到DataTable中的SQL查询中的一些信息),并将其保存到.tsv文件中供以后使用通过另一个程序.
我的问题是,有时源.csv文件超过10,000行,程序在遍历行时逐渐减慢.如果.csv文件是~500行,则需要大约45秒才能完成,并且随着.csv文件变大,这一时间会呈指数级变差.
SQL查询返回37,000多行,但是只请求一次,并且与.csv文件的排序方式相同,所以通常我不会注意到它正在运行该文件,除非它找不到相应的数据,在这种情况下它使它一直通过并返回适当的错误文本.我99%肯定这不是减速的原因.
循环的y和z需要与它们完全一样长.
如果这是绝对必要的,我可以从最初的.csv文件中删除一些数据并发布一个例子,但我真的希望我只是遗漏了一些非常明显的东西.
先谢谢你们!
这是我的来源:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Text;
namespace MoxySectorFormatter
{
class Program
{
static void Main(string[] args)
{
DataTable resultTable = new DataTable();
double curLine = 1;
double numLines = 0;
string ExportPath = @"***PATH***\***OUTFILE***.tsv";
string ImportPath = @"***PATH***\***INFILE***.csv";
string NewText = "SECURITY\r\n";
string OrigText = "";
string QueryString = "SELECT DISTINCT UPPER(MP.Symbol) AS Symbol, LOWER(MP.SecType) AS SecType, MBI.Status …Run Code Online (Sandbox Code Playgroud) 如果你在单个语句中执行某些操作,例如"abc"+ stringval +"abc",那么是一个不可变的字符串副本,或者两个(注意到abc和123在编译时是常量)
奖金回合:会使用像下面这样的StringBuilder或多或少的开销?
def surround(s:String, ss:String):String = {
val surrounded = new StringBuilder(s.length() + 2*ss.length(), s)
surrounded.insert(0,ss)
surrounded.append(ss)
surrounded.mkString
}
Run Code Online (Sandbox Code Playgroud)
还是有一种我不知道的更惯用的方式?
string stringbuilder scala string-concatenation immutability
我有以下内容:
StringBuilder errors = new StringBuilder();
if(IsNullOrEmpty(value))
{
errors.AppendLine("Enter value");
}
if(IsNullOrEmpty(value2))
{
errors.AppendLine("Enter value 2");
}
Run Code Online (Sandbox Code Playgroud)
我希望这会显示:
Enter value
Enter value 2
但它显示:
Enter value Enter value 2
我也尝试过: AppendFormat("Enter value{0}",Environment.NewLine);
以及\n角色.
错误字符串输出到asp:Label,如:
lblErrors.Text = errors.ToString();
Run Code Online (Sandbox Code Playgroud) 选择StringBuffer和之间的标准StringBuilder
我有以下代码:
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
strCsv.Append( XC.CleanForCsv(ds.Tables[0].Rows[i][j].ToString()) + ",");
}
strCsv.Append( "\r\n" + strCsv)
}
Run Code Online (Sandbox Code Playgroud)
Dataset包含8000条记录.for仅在15条记录strCsv.Append( "\r\n" + strCsv)语句之后使用循环循环记录抛出异常说明System.OutOfMemoryException.这个例外背后的原因是什么?
这是我的代码:
public class Stringclass
{
public static void main(String args[])
{
StringBuilder s=new StringBuilder();
s.append("v g f j v n x jc kn vd df jdf jkd kfd kfk dfkd lkd fmk dkkdfd kfdkfn kdfd end");
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
和输出是
v g f j v n x jc kn vd df jdf jkd kfd kfk dfkd lkd fmk dkkdfd kfdkfn kdfd end
Run Code Online (Sandbox Code Playgroud)
根据[Java docs](http://docs.oracle.com/javase/tutorial/java/data/buffers.html),字符串构建器只能存储16个空字符,所以我怎样才能将所有字符都存储为输出.
如果我写这个代码,那么输出也是一样的:
public class Stringclass
{
public static void main(String args[])
{
StringBuilder s=new StringBuilder("v …Run Code Online (Sandbox Code Playgroud) 我正在使用System.Net.Mail.MailMessage该类生成一个简单的电子邮件,并使用StringBuilder.我正在循环string[]并尝试每次添加一个新行.我遇到的问题是我似乎每次都无法生成一个新行.我可以得到两个或没有.
我尝试过的:
foreach (var message in messages)
{
body.AppendLine(message);
}
foreach (var message in messages)
{
body.Append(message + "\n");
}
foreach (var message in messages)
{
body.Append(message + System.Environment.NewLine);
}
Run Code Online (Sandbox Code Playgroud)
我也试过了string.Format().
对于上面的每个例子,我得到相同的结果.没有生成新行.
但是,当我尝试以下操作时,我得到了预期的结果.中间有空行的新行.
foreach (var message in messages)
{
body.AppendLine(message + System.Environment.NewLine);
}
Run Code Online (Sandbox Code Playgroud)
为什么要这样做,我该怎么办才能每次只获得一条新线?
更新:
所以我发现Outlook和可能的Gmail(没有测试过其他人)实际上是删除了一些换行而不是其他换行符.有谁知道他们为什么或如何确定要删除的内容?

基本上,(dog)(cat)(mouse)需要(dog) (cat) (mouse).
我试过的代码:
StringBuilder sb = new StringBuilder("(dog)(cat)(mouse)");
for (int i = 0; i < sb.length(); i ++)
{
if (sb.charAt(i) == ')')
{
sb.insert(i, ' ');
}
}
String result = sb.toString();
Run Code Online (Sandbox Code Playgroud)
但我得到某种"Java堆空间"错误
我目前正在做一段代码,必须能够匹配一些正则表达式,并在匹配正则表达式的字符串中进行一些替换.
为了做到这一点,我在java中使用matcher对象.但正如您可以在互联网上看到的那样,所有示例都使用StringBuffer来使用appendreplacement和appendtail方法(oracleDoc)进行替换.
但是当我推送我的代码时,Sonar抱怨使用stringbuffer而不是stringbuilder.
显然,一些开发人员抱怨这里.
我找到了一种不使用StringBuffer并使用StringBuilder的方法,但我确信这不如使用StringBuffer那样有效(并且可能是一种不好的做法).您可以在junit测试中复制粘贴,此示例代码如下:
String entry = "Actual 4.11-6 and 13-5";
String expectedReturn = "Actual 4*11^(-6) and 13^(-5)";
String number = "(^|\\s)-?\\d+((\\.||,)\\d+){0,1}(.\\d+){0,1}-\\d+";
Pattern pattern = Pattern.compile(number);
Matcher matcher = pattern.matcher(entry);
//USING STRING BUFFER
StringBuffer stringBuffer = new StringBuffer();
String substring;
while(matcher.find()){
substring = matcher.group(0);
matcher.appendReplacement(stringBuffer,substring.replace(".","*").replace("-","^(-")+")");
}
matcher.appendTail(stringBuffer);
//USING STRING BUILDER
matcher = pattern.matcher(entry);
int lastIndex = 0;
StringBuilder stringBuilder = new StringBuilder();
while(matcher.find()){
stringBuilder.append(entry.substring(lastIndex,matcher.start()));
substring = matcher.group(0);
stringBuilder.append(substring.replace(".","*").replace("-","^(-")+")");
lastIndex = matcher.end(); …Run Code Online (Sandbox Code Playgroud) 我收到型号清单。模型的数量可能很大。该模型具有许多特性,其中任何一个都可能为空。
我需要基于其属性为每个模型构建一个字符串。如果property == null,则将一些静态部分添加到结果字符串中,例如“ property1为null”。
如果else 属性== null,则添加类似以下内容:“ property1 =='valueOfThePropertyHere'”。
结果字符串应如下所示:
prop1 == 'value1' and prop2 is null and prop3 == 'value3' and prop4 == 'value4' and prop5 is null and ..... propN == 'valueN'
然后从列表中为每个模型生成这样的字符串。
显然,我在for循环中执行此操作,为此我使用了StringBuilder。关键是在StringBuilder的append方法中,我使用三元运算符检查模型的每个字段是否为null,并基于此将检查结果添加到结果字符串中。但是,如果属性不为null,则需要添加一些静态部分+字段本身的值+一些更多静态内容。这意味着我需要为我拥有的每个属性再添加一个StringBuilder。或者我可以使用“ +”,无论如何它将被转换成StringBuilder,据我所知,在StringBuilder中使用“ +”是一个不好的做法(但是我仍然必须使用它)。
例:
List<Model> models = repository.getModels();
for (Model m: models) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder
.append(m.getField1() == null ? "field1 is null" : "field1 == '" + new StringBuiler().append(m.getField1()).append("'").append(" …Run Code Online (Sandbox Code Playgroud) stringbuilder ×10
java ×5
c# ×4
string ×4
stringbuffer ×2
append ×1
asp.net ×1
char ×1
gmail ×1
immutability ×1
loops ×1
newline ×1
outlook ×1
performance ×1
scala ×1
sonarqube ×1