使用keyvaluepair构建的字符串是这样的:"name1 = v1&name2 = v2&name3 = v3"
我在做什么:
var sb = new StringBuilder();
foreach (var name in nameValues)
{
sb.AppendFormat("{0}={1}&", name.Key, name.Value);
}
//remove last '&' sign, this is what i think is ugly
sb.ToString().Remove(lastIndex);
Run Code Online (Sandbox Code Playgroud)
任何优雅的方法,以避免'&'符号的最后删除声明?
我每秒收到大约5条消息.它们中的每一个都有一个字符串,我将其连接到一个包含所有收到的消息的主字符串
string _masterText = "";
public void AddNewMessage(string text) // this is going to be call at least 5 times/second
{
_masterText += text;
}
Run Code Online (Sandbox Code Playgroud)
这是合适的方式吗?或者我应该使用StringBuilder,如:
StringBuilder _masterText = new StringBuilder();
public void AddNewMessage(string text) // this is going to be call at least 5 times/second
{
_masterText.Append(text);
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个现有的StringBuilder对象,代码附加一些值和一个分隔符.现在我想修改代码以添加逻辑,在附加我要检查的文本之前是否确实存在于字符串生成器变量中?如果没有,那么只有附加否则忽略.这样做的最佳方法是什么?我是否需要将对象更改为字符串类型?需要一种不会妨碍性能的最佳方法.
public static string BuildUniqueIDList(context RequestContext)
{
string rtnvalue = string.Empty;
try
{
StringBuilder strUIDList = new StringBuilder(100);
for (int iCntr = 0; iCntr < RequestContext.accounts.Length; iCntr++)
{
if (iCntr > 0)
{
strUIDList.Append(",");
}
//need to do somthing like strUIDList.Contains(RequestContext.accounts[iCntr].uniqueid) then continue other wise append
strUIDList.Append(RequestContext.accounts[iCntr].uniqueid);
}
rtnvalue = strUIDList.ToString();
}
catch (Exception e)
{
throw;
}
return rtnvalue;
}
Run Code Online (Sandbox Code Playgroud)
我不确定是否有类似的东西会有效:if(!strUIDList.ToString().Contains(RequestContext.accounts [iCntr] .uniqueid.ToString()))
我想问一下人们对于编写字符串的想法,以及构建字符串时性能是否存在巨大差异.
近年来我一直被告知永远不要做以下事情:
string dogName = "Ralph";
DateTime bornDate = DateTime.Parse("2010-01-01");
string fullText = "I am a Dog and my name is " + dogName + " and i was born on the " + bornDate.ToString("dd/MM/yyyy");
Run Code Online (Sandbox Code Playgroud)
并总是告诉类似下面的东西.
string dogName = "Ralph";
DateTime bornDate = DateTime.Parse("2010-01-01");
string fullText2 = String.Format("I am a Dog and my name is {0} and i was born on the {1:dd/MM/yyyy}", dogName, bornDate);
Run Code Online (Sandbox Code Playgroud)
我看到使用后面的语句的原因,但是有没有人知道第一个有什么类型的性能问题.
并使用StringBuilder对象而不是使用
string str = "Adding this comment to the string\n"
str += "Then Add …Run Code Online (Sandbox Code Playgroud) StringBuilder与+连接相比,为什么速度较慢?
StringBuilder是为了避免额外的对象创建,但为什么它会惩罚性能?
static void Main(string[] args)
{
int max = 1000000;
for (int times = 0; times < 5; times++)
{
Console.WriteLine("\ntime: {0}", (times+1).ToString());
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < max; i++)
{
string msg = "Your total is ";
msg += "$500 ";
msg += DateTime.Now;
}
sw.Stop();
Console.WriteLine("String +\t: {0}ms", ((int)sw.ElapsedMilliseconds).ToString().PadLeft(6));
sw = Stopwatch.StartNew();
for (int j = 0; j < max; j++)
{
StringBuilder msg = new StringBuilder();
msg.Append("Your total …Run Code Online (Sandbox Code Playgroud) 我有5个复选框,我必须选中多个复选框.
我做了这样的代码检查复选框已选中:
sports=(CheckBox)findViewById(R.id.sports_btn);
sports.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (sports.isChecked() == true)
list.add("4");
}
});
Run Code Online (Sandbox Code Playgroud)
我正在为数组列表添加一个值:
list ArrayList<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
我正在检索像这样的字符串值:
StringBuilder sb = new StringBuilder();
for(int i =0; i < list.size(); i++)
{
for (String str: list)
{
sb.append(str.toString());
sb.append(",");
}
}
String sel_cat = sb;
Run Code Online (Sandbox Code Playgroud)
我收到字符串,但如果选择了两个值,它就像2,3,如何删除最后一个逗号?我不希望最后一个逗号字符串必须像2,3.
我正在构建一个压力测试客户端,它使用尽可能多的线程来锤击服务器并分析响应,因为客户端可以集合.我经常发现自己受到垃圾收集(和/或缺乏收集)的限制,并且在大多数情况下,它归结为我实例化的字符串,只是将它们传递给Regex或Xml解析例程.
如果您对Regex类进行反编译,您将在内部看到它使用StringBuilders来执行几乎所有操作,但是您不能将它传递给字符串构建器; 在开始使用私有方法之前,它有助于深入研究私有方法,因此扩展方法也不会解决它.如果您想从System.Xml.Linq中的解析器中获取对象图,则处于类似情况.
这不是一个迂腐过度优化的案例.我查看了StringBuilder问题和其他问题中的正则表达式替换.我还介绍了我的应用程序,看看天花板的来源,Regex.Replace()现在使用确实在方法链中引入了大量开销,我试图以每小时数百万的请求命中服务器,并检查XML响应中的错误和嵌入式诊断代码.我已经摆脱了限制吞吐量的所有其他低效率,并且当我不需要捕获组或反向引用时,我甚至通过扩展StringBuilder来进行通配符查找/替换,从而减少了大量的Regex开销.但在我看来,现在有人会把自定义的StringBuilder(或更好的,基于Stream)的Regex和Xml解析实用程序包起来.
好吧,如此咆哮,但我自己必须这样做吗?
更新:我找到了一个解决方法,将峰值内存消耗从几千兆字节降低到几百兆,所以我将其发布在下面.我不是把它作为答案添加因为a)我一般不喜欢这样做,而且b)我仍然想知道是否有人花时间定制StringBuilder来做Regexes(反之亦然).
在我的情况下,我无法使用XmlReader,因为我正在摄取的流包含某些元素中的一些无效二进制内容.为了解析XML,我必须清空这些元素.我以前使用单个静态编译的Regex实例进行替换,这就像疯了一样消耗内存(我正在尝试处理~300个10KB docs/sec).大幅减少消费的变化是:
IndexOf方法.WildcardReplace方法,每次调用允许一个通配符(*或?) WildcardReplace()调用来替换正则表达式的用法,以清空有问题的元素的内容这是非常不合适的,仅在我自己的目的要求下进行测试; 我会让它更优雅和强大,但YAGNI和所有这一切,我很匆忙.这是代码:
/// <summary>
/// Performs basic wildcard find and replace on a string builder, observing one of two
/// wildcard characters: * matches any number of characters, or ? matches a single character.
/// Operates on only one wildcard per invocation; 2 …Run Code Online (Sandbox Code Playgroud) 我问的问题与StringBuilder和StringBuffer之间的差异有关, 但不一样.我想看看如果同时由两个线程修改StringBuilder会发生什么.
我写了以下课程:
public class ThreadTester
{
public static void main(String[] args) throws InterruptedException
{
Runnable threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
myThread.start();
for (int i = 0; i < 100; i++)
{
Thread.sleep(10);
StringContainer.addToSb("a");
}
System.out.println("1: " + StringContainer.getSb());
System.out.println("1 length: " + StringContainer.getSb().length());
}
}
public class MyRunnable implements Runnable
{
@Override
public void run()
{
for (int i = 0; i < 100; i++)
{
try
{
Thread.sleep(10);
}
catch (InterruptedException e) …Run Code Online (Sandbox Code Playgroud) java stringbuilder multithreading synchronization stringbuffer
我有一个存储在StringBuilder对象中的密码.我正在寻找一种方法来擦除内存中的密码.以下任何方法都可以实现此目的:
'\0'.如果我最初分配了足够的内存,这可以保证使用相同的内存吗?ZeroMemory()或SecureZeroMemory()
用StringBuilder?任何代码示例?编辑:
使用SecureString对我来说不是一个选项,因为我打电话CredUIPromptForCredentials()来获取凭据.
该类StringBuilder定义了四个构造函数,但它们都没有接受StringBuilder,但以下编译:
StringBuilder sb = new StringBuilder(new StringBuilder("Hello"));
Run Code Online (Sandbox Code Playgroud)
这是否意味着StringBuilder编译器在内部以某种方式将匿名对象转换为String?
stringbuilder ×10
c# ×6
java ×2
string ×2
.net ×1
android ×1
checkbox ×1
constructor ×1
contains ×1
regex ×1
security ×1
stringbuffer ×1