我的问题是,如果我有时在同一个字符串上使用多线程
字符串不会被替换.(我在记事本上写了这个,所以语法可能是
错误)
使用System.Thread ...其他的课程
class ....
{
private static StringBuild container = new StringBuilder();
static void Main(...)
{
container.Append(Read From File(Kind of long));
Thread thread1 = new Thread(Function1);
Thread thread2 = new Thread(Function2);
thread1.Start();
thread2.Start();
//Print out container
}
static void Function1
{
//Do calculation and stuff to get the Array for the foreach
foreach (.......Long loop........)
{
container.Replace("this", "With this")
}
}
//Same goes for function but replacing different things.
static void Function2
{
//Do calculation and stuff …Run Code Online (Sandbox Code Playgroud) 作为填充搜索引擎的过程的一部分,我也填充了Berekely-DB值存储.每晚重复此过程,此时每晚总运行时间的+/- 60%是由创建要插入值存储的值引起的(因此不包括实际插入Berekely-DB的时间和导致的时间由Berekely客户提供
这些值是通过为每个键分配一个stringbuilder创建的,并且平均将大约1000个字符串附加到这样的stringbuilder.结果值平均约为10k.我想知道这是否可以更有效地完成,因为: - (平均而言)附加到每个Stringbuilders的1000个字符串具有固定长度:即:每个String具有相同的长度并且该长度在前面已知) - 所有字符串被附加到末尾.
例如,为char []或characterStream/writer交换stringbuilder会更高效吗?这样我就可以在char []中保留并索引写入的位置.
谢谢,Geert-Jan
我试图使用C++ DLL在C#中编辑我的StringBuilder对象.我的C++代码如下所示:
extern "C" __declspec(dllexport) void __stdcall PrintHead(char* myString)
{
myString = "testIsOkey";
}
Run Code Online (Sandbox Code Playgroud)
我的C#代码是:
[DllImport("StringEdit.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = false)]
public static extern void PrintHead([MarshalAs(UnmanagedType.LPStr)] StringBuilder stringBuilder);
private void button1_Click(object sender, EventArgs e)
{
StringBuilder stringBuilder = new StringBuilder("123456");
PrintHead(stringBuilder);
}
Run Code Online (Sandbox Code Playgroud)
在调用PrintHead之后,我希望看到stringBuilder对象的值从"123456"更改为"testIsOkey",但它不会更改.我无法弄清楚我在哪里弄错了.
谢谢你的帮助.
我有一个List<string>我正在迭代并拆分每个项目然后将其添加到StringBuilder.
foreach(string part in List)
{
StringBuilder.Append(part.Split(':')[1] + " ");
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是通过这种分割创建了多少个字符串?所有拆分都将产生两个项目.所以...我在想它会创建一个string[2]然后是一个空字符串.但是,它是否会创建连接,string[1] + " "然后将其添加到StringBuilder或优化?
getter将获得有关它所在的struct的状态的消息,它由struct的属性的组合定义,这些属性是有限的.
首先,这不是关于微优化,我只是认为:
StringBuilder msg = new StringBuilder();
...
msg.AppendLine("static string");
...
Run Code Online (Sandbox Code Playgroud)
看起来更清洁:
String msg = String.Empty;
...
msg = String.Concat(msg, "static string", System.Environment.NewLine)
...
Run Code Online (Sandbox Code Playgroud)
所以只是一种美学选择.
msg变量必须以任何方式初始化为空,因此额外的行不会给我带来麻烦.但是在返回字符串的字段中构造一个新的StringBuilder有多糟糕?
编辑 我只是想知道,如果把一个StringBuilder构造函数的吸气剂要开拓蠕虫的一个巨大的罐头,是荒谬的开销,一些从来没有在干将样的反模式的东西使用构造函数,等等......不知道大家是最喜欢连接非循环字符串的最佳方式.
EDIT2 getter的常用,最佳实践,性能阈值是什么,StringBuilder构造函数是否低于此值?
我正在使用StringBuilder将列表转换为单个字符串.我不希望字符串有换行符,但它会自动为附加到字符串的每个列表值添加一个新行.
for (int i = 1; i <= ruleN; i++)
{
string fizz = "F";
string buzz = "B";
string fizzBuzz = "FB";
List<string> numberSet = new List<string>();
if(i % ruleA == 0 && i % ruleB != 0) //if i is devisible by A
//but not B
{
numberSet.Add(fizz);
}
if(i % ruleB == 0 && i % ruleA != 0) //if i is devisible by B
//but not A
{
numberSet.Add(buzz);
}
if(i % ruleA == 0 && …Run Code Online (Sandbox Code Playgroud) 我对StringBUilder.append()感到困惑.Netbeans说不允许使用void类型.
这是我的Java类Levencthein.java
public void printDistance(String s1, String s2) {
System.out.println( computeEditDistance(s1, s2) + " ("+similarity(s1, s2) * 100 +")");
}
Run Code Online (Sandbox Code Playgroud)
现在,在另一个类中,假设b.java
StringBuilder s = new StringBuilder();
for (final JCCDFile file : files) {
LevenshteinDistance lv = new LevenshteinDistance();
if (idLexerSelection != getIDLexer()) {
System.out.println(temp.getName() + " ==> " + file.getName());
s.append(lv.printDistance(name1, name2)); This is the error
sb.append(file.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
任何解决方案
我刚刚开始学习Java,我想尝试使用数组来表示大的负数.
假设我有一个数组
[-2, 0, -5] and this represents the number -502
Run Code Online (Sandbox Code Playgroud)
我尝试过使用StringBuilder,但是打印出来了
-50-2
Run Code Online (Sandbox Code Playgroud)
这是我现在的代码.有没有办法让它可以附加第一个否定,然后在我构建一个新的String时跳过其余的底片?
StringBuilder sb = new StringBuilder();
for(int x = arr.length-1; x>=0; x--){
sb.append(arr[x]);
}
String check = sb.toString();
System.out.println(check);
Run Code Online (Sandbox Code Playgroud) 我使用StringBuilder创建一个长文本,但我想要新行字符'\n'(Unix模式)而不是'\ r \n',然后我会将整个文本写入文件.
我试图在行之间插入'\n'字符并设置AppendFormat方法但没用.
也许我沿'\n'字符分割这个长文本,然后我将这些行分别写在文件中.
string rowStart = "\n*****" + from + "|" + to;
StringBuilder sb = new StringBuilder();
sb.Append(data[0]);
for (int i = 1; i < data.Count; i++)
{
//sb.AppendFormat("\n{0}", rowStart + data[i]); not work
sb.Append(rowStart + data[i]);
}
//var t = sb.Replace("\r\n","\n"); not work
return sb.ToString();
Run Code Online (Sandbox Code Playgroud) 在我当前的项目中,他们将每个SQL查询都放在“ QueryList”类中,每个查询都是一个不同的Get方法。我不明白的是,它们在这些方法中使用StringBuilder来构建常量字符串,在它们中没有使用任何操作或串联。当我对此提出疑问时,他们说,最好使用串联。据我所知,字符串文字的串联由编译器解决,对吗?编译器中是否对此类StringBuilder代码进行了优化?
我在Java中看到了类似的问题(用于常量的Stringbuilder),对于C#是否应该相同?
public static class QueryList
{
private static StringBuilder GetQuery
{
get
{
StringBuilder query = new StringBuilder();
query.Append(" INSERT INTO ");
query.Append(" MyTable ");
query.Append(" (column1, column2) ");
query.Append(" VALUES ");
query.Append(" (@val1 , @val2) ");
return query;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在其中被称为
string query = QueryList.GetQuery.ToString();
Run Code Online (Sandbox Code Playgroud)
我进行了一些计数,大约有700种此类方法的调用,所有方法后面都带有“ .ToString();”。我知道在进行实际的字符串连接时会更好,但是只有34个需要它的调用。该程序每秒大约有200个查询。
stringbuilder ×10
c# ×7
java ×3
string ×2
.net-4.5 ×1
arrays ×1
c++ ×1
getter ×1
marshalling ×1
newline ×1
performance ×1
split ×1
void ×1