【发布时间】:2010-11-11 14:28:25
【问题描述】:
我需要做以下事情:
static string[] pats = { "å", "Å", "æ", "Æ", "ä", "Ä", "ö", "Ö", "ø", "Ø" ,"è", "È", "à", "À", "ì", "Ì", "õ", "Õ", "ï", "Ï" };
static string[] repl = { "a", "A", "a", "A", "a", "A", "o", "O", "o", "O", "e", "E", "a", "A", "i", "I", "o", "O", "i", "I" };
static int i = pats.Length;
int j;
// function for the replacement(s)
public string DoRepl(string Inp) {
string tmp = Inp;
for( j = 0; j < i; j++ ) {
tmp = Regex.Replace(tmp,pats[j],repl[j]);
}
return tmp.ToString();
}
/* Main flow processes about 45000 lines of input */
每行有 6 个元素通过 DoRepl。大约 300,000 个函数调用。每个执行 20 次 Regex.Replace,总计约 600 万次替换。
有没有更优雅的方法可以在更少的通行数中做到这一点?
【问题讨论】:
-
您的问题标题是“更快”,但您的问题却是“优雅”,您追求的是哪一个?两者可以相互排斥,但肯定不总是相互排斥的。
-
很好地指出,实际上代码运行速度确实足够快,我一直在寻找一种在计算周期方面更有效的方法。现在是 45,000 行输入,但它可能会扩展到数百万行和每行数十个元素,这意味着相当多的替换。
-
实际上,如果有任何方法可以轻松地将“特殊”字母更改为最基本的字母(通过更改代码页或任何其他方式,它会同样有帮助) - 所有这些 äåâãàá-变体为 a 等。
-
最快的(恕我直言) - 是使用地图[65536](见下面我的回答),另一方面更优雅......我猜它也在使用那个地图:),或者,取决于您要使用多少语言和 BCL 功能,可以使其相当复杂。字典方法可以节省内存,但会降低速度,因为它需要为每个字符执行更昂贵的存储桶查找。
-
别忘了,在你的情况下,你只是想替换重音字符。因此,所有替换字符都大于 ascii 表中的小写“z”。在运行查找之前,请确保 chars 值大于 'z'