标签: stringbuilder

在c#中构建字符串的优雅方式

使用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)

任何优雅的方法,以避免'&'符号的最后删除声明?

c# stringbuilder

10
推荐指数
2
解决办法
950
查看次数

StringBuilder或+ =

我每秒收到大约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)

谢谢

.net stringbuilder string-concatenation

10
推荐指数
2
解决办法
1226
查看次数

在C#中,检查stringbuilder是否包含子字符串的最佳方法

我有一个现有的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()))

c# string stringbuilder contains

10
推荐指数
1
解决办法
2万
查看次数

带有"+"的字符串格式和构造字符串

我想问一下人们对于编写字符串的想法,以及构建字符串时性能是否存在巨大差异.

近年来我一直被告知永远不要做以下事情:

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)

c# string stringbuilder

10
推荐指数
2
解决办法
2万
查看次数

为什么StringBuilder比字符串连接慢?

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)

c# stringbuilder string-concatenation

10
推荐指数
2
解决办法
5443
查看次数

附加StringBuilder

我有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.

checkbox stringbuilder android

10
推荐指数
2
解决办法
4万
查看次数

是否有人围绕StringBuilders或Streams实现了正则表达式和/或Xml解析器?

我正在构建一个压力测试客户端,它使用尽可能多的线程来锤击服务器并分析响应,因为客户端可以集合.我经常发现自己受到垃圾收集(和/或缺乏收集)的限制,并且在大多数情况下,它归结为我实例化的字符串,只是将它们传递给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).大幅减少消费的变化是:

  1. 在CodeProject上的这篇StringBuilder Extensions文章中添加了代码,以获得方便的IndexOf方法.
  2. 我添加了一个(非常)粗略的WildcardReplace方法,每次调用允许一个通配符(*或?)
  3. 我用一个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)

c# regex stringbuilder

10
推荐指数
1
解决办法
1024
查看次数

StringBuilder由多个线程修改

我问的问题与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

10
推荐指数
1
解决办法
1456
查看次数

如何用零擦除StringBuilder内存

我有一个存储在StringBuilder对象中的密码.我正在寻找一种方法来擦除内存中的密码.以下任何方法都可以实现此目的:

  1. 迭代StringBuilder字符并分配'\0'.如果我最初分配了足够的内存,这可以保证使用相同的内存吗?
  2. 我可以使用任何非托管API像ZeroMemory()SecureZeroMemory()StringBuilder?任何代码示例?

编辑:

使用SecureString对我来说不是一个选项,因为我打电话CredUIPromptForCredentials()来获取凭据.

c# security stringbuilder

10
推荐指数
1
解决办法
845
查看次数

StringBuilder构造函数接受StringBuilder对象 - 为什么?

该类StringBuilder定义了四个构造函数,但它们都没有接受StringBuilder,但以下编译:

StringBuilder sb = new StringBuilder(new StringBuilder("Hello"));
Run Code Online (Sandbox Code Playgroud)

这是否意味着StringBuilder编译器在内部以某种方式将匿名对象转换为String?

java stringbuilder constructor

10
推荐指数
2
解决办法
593
查看次数