我有一个字符串,我需要用字典中的值替换标记.它必须尽可能高效.使用string.replace执行循环只会消耗内存(字符串是不可变的,请记住).StringBuilder.Replace()会更好,因为它是用于字符串操作的吗?
我希望避免花费RegEx,但如果这样做会更有效率那么就这样吧.
注意:我不关心代码复杂性,只关心它运行的速度和消耗的内存.
平均统计数据:长度为255-1024个字符,字典中为15-30个字符.
我正在将文本文件的内容写入StringBuilder,然后我想使用正则表达式对StringBuilder中包含的文本执行许多查找/替换操作.
我遇到了一个问题,因为StringBuilder替换函数不能接受正则表达式参数.
我可以在普通字符串上使用Regex.Replace,但我认为这是低效的,因为由于.net字符串是不可变的,因此需要在内存中创建两个字符串副本.
一旦我更新了文本,我打算将其写回原始文件.
什么是解决我问题的最佳和最有效的方法?
编辑
除了下面的答案,我发现以下问题也解释了我的问题 -
我们需要将包含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来创建输出文件.而且我也知道丢弃的字符串将被垃圾收集(在时间结束之前的某个时刻).我想知道是否有更好,更有效的方法来替换字符串中所有出现的特定字符/子字符串,这不会另外创建字符串.
根据以下单元测试方法,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