我想替换文件中字符串内容中的字符。 在Dictionary下面显示Key为不需要的字符,我需要用Dictionary中的值替换。
Dictionary<string, string> unwantedCharacters = new Dictionary<string, string>();
unwantedCharacters["É"] = "@";
unwantedCharacters["Ä"] = "[";
unwantedCharacters["Ö"] = "\\";
unwantedCharacters["Å"] = "]";
unwantedCharacters["Ü"] = "^";
unwantedCharacters["é"] = "`";
unwantedCharacters["ä"] = "{";
unwantedCharacters["ö"] = "|";
unwantedCharacters["å"] = "}";
unwantedCharacters["ü"] = "~";
这是我目前使用的代码,感觉它占用了太多的执行时间..
for (int index = 0; index < fileContents.Length; index++)
{
foreach (KeyValuePair<string, string> item in unwantedCharacters)
{
if (fileContents.IndexOf(item.Key) > -1)
{
fileContents = fileContents.Replace(item.Key, item.Value); // Replacing straight characters
}
}
}
即循环两个级别..任何其他方式实现此...任何帮助将不胜感激
答案 0 :(得分:3)
由于您没有修改字符串的长度,如果您unwantedCharacters
而不是Dictionary<char, char>
而不是<string, string>
,则可以执行以下操作:
var charArray = fileContents.ToCharArray();
for (int i = 0; i < charArray.Length; i++)
{
char replacement;
if (unwantedCharacters.TryGetValue(charArray[i], out replacement))
charArray[i] = replacement;
}
fileContents = new string(charArray);
在与输入字符串的长度相关时,性能为O(n)
。
答案 1 :(得分:2)
看看这个答案:answer
但是在这段代码中提出了你的特征:
IDictionary<string,string> map = new Dictionary<string,string>()
{
{"É", = "@"},
{"Ä", = "["},
{"Ö", = "\\"},
...
};
答案 2 :(得分:1)
看来fileContents是一个字符串值。你可以简单地在字符串上调用replace。
foreach (KeyValuePair<string, string> item in unwantedCharacters)
{
fileContents = fileContents.Replace(item.Key, item.Value);
}
答案 3 :(得分:1)
为了替换字符串中的许多字符,请考虑使用StringBuilder Class。替换字符串中的一个字符会导致创建新的字符串,因此效率非常低。试试以下内容:
var sb = new StringBuilder(fileContents.Length);
foreach (var c in fileContents)
sb.Append(unwantedCharacters.ContainsKey(c) ? unwantedCharacters[c] : c);
fileContents = sb.ToString();
我在这里假设您的词典包含字符(Dictionary<char, char>
)。这是一个案例,只是评论,我将编辑解决方案。
我还假设,fileContents
是一个字符串。
您也可以使用 LINQ 代替 StringBuilder :
var fileContentsEnumerable = from c in fileContents
select unwantedCharacters.ContainsKey(c) ? unwantedCharacters[c] : c;
fileContents = new string(fileContentsEnumerable.ToArray());
答案 4 :(得分:1)
您想要构建过滤器。您处理文件的内容,并在处理文件时进行替换。
这样的事情:
using(StreamReader reader = new StreamReader("filename"))
using (StreamWriter writer = new StreamWriter("outfile"))
{
char currChar = 0;
while ((currChar = reader.Read()) >= 0)
{
char outChar = unwantedCharacters.ContainsKey(currChar)
? unwantedCharacters[currChar]
: (char) currChar;
writer.Write(outChar);
}
}
如果您的数据在内存中,或者通过fileContents
的循环是字符串或字符数组,您可以使用记忆流。
这个解决方案是O(n),其中n是文件的长度,这要归功于字典(请注意,您可以使用简单的稀疏数组而不是字典,并且可以获得相当快的速度)。
不要按照其他建议迭代字典,因为每个替换都是O(n)所以最终总时间为O(n * d),d是字典大小,如你必须多次浏览文件。
答案 5 :(得分:0)
删除foreach
并替换为for
循环,从0到item.Count
。希望This article会有所帮助。