相关疑难解决方法(0)

String.Replace()与StringBuilder.Replace()

我有一个字符串,我需要用字典中的值替换标记.它必须尽可能高效.使用string.replace执行循环只会消耗内存(字符串是不可变的,请记住).StringBuilder.Replace()会更好,因为它是用于字符串操作的吗?

我希望避免花费RegEx,但如果这样做会更有效率那么就这样吧.

注意:我不关心代码复杂性,只关心它运行的速度和消耗的内存.

平均统计数据:长度为255-1024个字符,字典中为15-30个字符.

.net c# replace .net-4.0

73
推荐指数
4
解决办法
5万
查看次数

StringBuilder中的正则表达式替换

我正在将文本文件的内容写入StringBuilder,然后我想使用正则表达式对StringBuilder中包含的文本执行许多查找/替换操作.

我遇到了一个问题,因为StringBuilder替换函数不能接受正则表达式参数.

我可以在普通字符串上使用Regex.Replace,但我认为这是低效的,因为由于.net字符串是不可变的,因此需要在内存中创建两个字符串副本.

一旦我更新了文本,我打算将其写回原始文件.

什么是解决我问题的最佳和最有效的方法?

编辑

除了下面的答案,我发现以下问题也解释了我的问题 -

c# regex stringbuilder

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

string.Replace(string,string)是否会创建其他字符串?

我们需要将包含dd/mm/yyyy格式日期的字符串转换为ddmmyyyy格式(如果您想知道我为什么要在字符串中存储日期,我的软件会处理批量事务文件,这是一种基于行的文本文件格式,由银行使用).

我目前正在这样做:

string oldFormat = "01/01/2014";
string newFormat = oldFormat.Replace("/", "");
Run Code Online (Sandbox Code Playgroud)

果然,这转化"01/01/2014""01012014".但我的问题是,替换是在一步中发生的,还是它创建了一个中间字符串(例如:"0101/2014""01/012014")?


这就是我问这个问题的原因:

我正在处理大小从几千字节到几百兆字节的事务文件.到目前为止,我还没有出现性能/内存问题,因为我仍在使用非常小的文件进行测试.但是当谈到兆字节时,我不确定我是否会遇到这些额外字符串的问题.我怀疑情况会是这样,因为strings是不可变的.有了数百万条记录,这种额外的内存消耗将大大增加.

我已经在使用StringBuilders来创建输出文件.而且我也知道丢弃的字符串将被垃圾收集(在时间结束之前的某个时刻).我想知道是否有更好,更有效的方法来替换字符串中所有出现的特定字符/子字符串,这不会另外创建字符串.

.net c#

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

为什么StringBuilder.Replace比String.Replace慢

根据以下单元测试方法,StringBuilder远比String.Replace慢,为什么每个人都说StringBuilder更快?我错过了什么吗?

[TestMethod]
public void StringReplace()
{
    DateTime date = DateTime.Now;
    string template = File.ReadAllText("file.txt");
    for (int i = 0; i < 100000; i++)
    {
        template = template.Replace("cat", "book" );
        template = template.Replace("book", "cat"); 
    }
    Assert.Fail((DateTime.Now - date).Milliseconds.ToString()); 
}

[TestMethod]
public void StringBuilder()
{
    DateTime date = DateTime.Now;
    StringBuilder template = new StringBuilder(File.ReadAllText("file.txt"));
    for (int i = 0; i < 100000; i++)
    {
        template.Replace("cat", "book");
        template.Replace("book", "cat"); 
    }
    Assert.Fail((DateTime.Now - date).Milliseconds.ToString());
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

StringReplace - 335ms

StringBuilder - 799ms

c# performance stringbuilder

-1
推荐指数
1
解决办法
1494
查看次数

标签 统计

c# ×4

.net ×2

stringbuilder ×2

.net-4.0 ×1

performance ×1

regex ×1

replace ×1