c# - String.Replace .NET Framework 的内存效率和性能

标签 c# .net string

 string str1 = "12345ABC...\\...ABC100000"; 
 // Hypothetically huge string of 100000 + Unicode Chars
 str1 = str1.Replace("1", string.Empty);
 str1 = str1.Replace("22", string.Empty);
 str1 = str1.Replace("656", string.Empty);
 str1 = str1.Replace("77ABC", string.Empty);

 // ...  this replace anti-pattern might happen with upto 50 consecutive lines of code.

 str1 = str1.Replace("ABCDEFGHIJD", string.Empty);

我继承了一些与上述代码段相同的代码。它需要一个大字符串并从大字符串中替换(删除)常量较小的字符串。

我认为这是一个内存密集型过程,因为新的大的不可变字符串正在为每个替换分配内存,等待通过 GC 死亡。

<强>1。忽略内存问题,替换这些值的最快方法是什么?

<强>2。实现相同结果的内存效率最高的方法是什么?

我希望这些是相同的答案!

也欢迎介于这些目标之间的实用解决方案。

假设:

  • 所有替换都是不变的并且提前知道
  • 底层字符确实包含一些 unicode [非 ascii] 字符

最佳答案

.NET 字符串中的

所有 字符都是“unicode 字符”。你是说他们是非ascii?那不应该有任何困难 - 除非你遇到组合问题,例如当您尝试替换“e acute”时,“e + acute accent”未被替换。

您可以尝试对 Regex.Replace 使用正则表达式, 或 StringBuilder.Replace .下面是对两者执行相同操作的示例代码:

using System;
using System.Text;
using System.Text.RegularExpressions;

class Test
{
    static void Main(string[] args)
    {
        string original = "abcdefghijkl";

        Regex regex = new Regex("a|c|e|g|i|k", RegexOptions.Compiled);

        string removedByRegex = regex.Replace(original, "");
        string removedByStringBuilder = new StringBuilder(original)
            .Replace("a", "")
            .Replace("c", "")
            .Replace("e", "")
            .Replace("g", "")
            .Replace("i", "")
            .Replace("k", "")
            .ToString();

        Console.WriteLine(removedByRegex);
        Console.WriteLine(removedByStringBuilder);
    }
}

我不想猜测哪个更有效 - 您必须根据您的特定应用程序进行基准测试。正则表达式方式可能能够在一次传递中完成所有操作,但与 StringBuilder 中的许多替换中的每一个相比,该传递将相对占用 CPU。

关于c# - String.Replace .NET Framework 的内存效率和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/399798/

相关文章:

string - 当参数可以是列表或字符串时,TCL使用 “eq”或 “==”

c# - 我们可以在 C# 中使用 Linq toentity 将匿名类型转换为 List <T> 吗?

c# - 如果我不打开 SqlConnection 实例会怎样?

c# - 如何使用 Audit.Net 扩展 Audit.Mvc 设置 AuditEvent 的目标对象

.net - 如何从.NET检索AD用户的创建日期?

java - 如何使用 java 正则表达式验证字符串?

c# - 在 .Net c# 中使用 OpenXML 在页脚中插入图像

c# - 管理列表项的困难

c# - 多个 ContextMenuStrip 的 ToolStripMenuItem

Java 小时到分钟 简单转换