如何有效地替换巨大字符串中的第一次出现?

时间:2017-09-27 11:49:15

标签: c# string performance

我有一行一百万个字母A.在循环中,我将字母A的第一个匹配项替换为“”,直到字母结束。

在更换之前,我必须确定字符串中是否存在,并且我这样做:

var inx = a.IndexOf(b, StringComparison.Ordinal);
if (inx > -1)
{
     RemoveAndInsertString(ref a, ref b, ref c, inx);
}

我试过了:

private void RemoveAndInsertString(ref string sourceString, ref string rowToRemove, ref string rowToInsert, int inx)
{
    Regex rgx = new Regex(rowToRemove);
    sourceString = rgx.Replace(sourceString, rowToInsert, 1);
}

private void RemoveAndInsertString(ref string sourceString, ref string rowToRemove, ref string rowToInsert, int inx)
{
    if (!String.IsNullOrEmpty(rowToInsert))
    {
        StringBuilder sb = new StringBuilder(sourceString.Length + rowToInsert.Length);
        sb.Append(sourceString.Substring(0, inx));
        sb.Append(rowToInsert);
        sb.Append(sourceString.Substring(inx + rowToRemove.Length, sourceString.Length - (inx + rowToRemove.Length)));
        sourceString = sb.ToString();
    }
}

但它太慢了!我做了一个测试,一个字符串长度为1,000,000:0.5秒为10,000次替换,52秒为100,000次替换。如果字符串包含1,000,000个要替换的字符 - 我等不及了!

如何加快更换?

我需要发表评论:这不是一个字符串的循环。情况如下: 我有100000行。行最多可包含1000000个字符。我应该替换substring,如果它存在于字符串中,或​​者跳过此字符串并在字符串中没有子字符串时进行一些操作。 并且,如果需要,程序中使用的行不支持Unicode。 A的示例 - 这是一个不好的例子,我同意,但这是一个测试,测试我的程序的性能(这不是我的测试)

0 个答案:

没有答案