C# 删除超长字符串中的标点符号
我正在为我的一门课程编写一个图书加密程序,我遇到了一个问题。我们的教授给我们举了一个例子,用《傲慢与偏见》这本书来加密,所以我选择了那本来测试我的程序。我正在使用的从字符串中删除标点符号的当前函数花费的时间太长,以至于程序被迫进入中断模式。这个函数适用于更小的字符串,甚至页面长度,但当我输入它时,它会变长C# 删除超长字符串中的标点符号,c#,string,visual-studio,C#,String,Visual Studio,我正在为我的一门课程编写一个图书加密程序,我遇到了一个问题。我们的教授给我们举了一个例子,用《傲慢与偏见》这本书来加密,所以我选择了那本来测试我的程序。我正在使用的从字符串中删除标点符号的当前函数花费的时间太长,以至于程序被迫进入中断模式。这个函数适用于更小的字符串,甚至页面长度,但当我输入它时,它会变长 public void removePunctuation(ref string s) { string result = ""; for (int i = 0; i <
public void removePunctuation(ref string s) {
string result = "";
for (int i = 0; i < s.Length; i++) {
if (Char.IsWhiteSpace(s[i])) {
result += ' ';
} else if (!Char.IsLetter(s[i]) && !Char.IsNumber(s[i])) {
// do nothing
} else {
result += s[i];
}
}
s = result;
}
public void remove标点符号(参考字符串s){
字符串结果=”;
对于(int i=0;i
所以我想如果有人有任何建议,我需要一种更快的方法来删除这个字符串中的标点符号?我知道在每个角色中循环都很可怕,但我被难倒了,而且我从来没有被教过深入的正则表达式
编辑:有人问我如何在dictionary类中存储字符串!这是另一个实际使用格式化字符串的类的构造函数
public CodeBook(string book)
{
BookMap = new Dictionary<string, List<int>>();
Key = book.Split(null).ToList(); // split string into words
foreach(string s in Key)
{
if (!BookMap.Keys.Contains(s))
{
BookMap.Add(s, Enumerable.Range(0, Key.Count).Where(i => Key[i] == s).ToList());
// add word and add list of occurrances of word
}
}
}
公共代码本(字符串本)
{
BookMap=新字典();
Key=book.Split(null).ToList();//将字符串拆分为单词
foreach(键中的字符串s)
{
如果(!BookMap.Keys.Contains))
{
BookMap.Add(s,Enumerable.Range(0,Key.Count).Where(i=>Key[i]==s.ToList());
//添加单词并添加单词发生的列表
}
}
}
每个字符循环一次也没那么糟糕。你一次就完成了这一切,这并不是要避免的小事
问题在于,每当您执行以下操作时,框架都需要分配(部分)字符串的新副本
result += s[i];
您可以通过引入StringBuilder
在执行时附加非标点字符来避免这种情况
public string removePunctuation(string s)
{
var result = new StringBuilder();
for (int i = 0; i < s.Length; i++) {
if (Char.IsWhiteSpace(s[i])) {
result.Append(" ");
} else if (!Char.IsLetter(s[i]) && !Char.IsNumber(s[i])) {
// do nothing
} else {
result.Append(s[i]);
}
}
return result.ToString();
}
公共字符串删除标点符号(字符串s)
{
var result=新的StringBuilder();
对于(int i=0;i
您可以使用改进的算法进一步减少必要的Append
调用的数量,例如,向前看下一个标点并立即追加较大的部分,或者使用现有的字符串操作库,如RegEx
。但是上面介绍的StringBuilder应该已经为您带来了显著的性能提升
我从未被深入地教过正则表达式
使用您选择的搜索提供程序,您可能会得到一个经过测试的解决方案,您可以学习并使用它:在每个字符中循环一次并不是那么糟糕。你一次就完成了这一切,这并不是要避免的小事 问题在于,每当您执行以下操作时,框架都需要分配(部分)字符串的新副本
result += s[i];
您可以通过引入StringBuilder
在执行时附加非标点字符来避免这种情况
public string removePunctuation(string s)
{
var result = new StringBuilder();
for (int i = 0; i < s.Length; i++) {
if (Char.IsWhiteSpace(s[i])) {
result.Append(" ");
} else if (!Char.IsLetter(s[i]) && !Char.IsNumber(s[i])) {
// do nothing
} else {
result.Append(s[i]);
}
}
return result.ToString();
}
公共字符串删除标点符号(字符串s)
{
var result=新的StringBuilder();
对于(int i=0;i
您可以使用改进的算法进一步减少必要的Append
调用的数量,例如,向前看下一个标点并立即追加较大的部分,或者使用现有的字符串操作库,如RegEx
。但是上面介绍的StringBuilder应该已经为您带来了显著的性能提升
我从未被深入地教过正则表达式
使用您选择的搜索提供程序,您可能会得到一个经过测试的解决方案,您只需学习和使用即可:这很慢,因为您通过循环中的串联来构造字符串。您有几种更有效的方法:
- 使用
-与每次添加字符时构造新对象的字符串连接不同,这种方法将正在构造的字符串扩展为更大的块,防止过多的垃圾创建StringBuilder
- 将LINQ的过滤与
-这种方法在一次快照中构造一个一起使用,其中
数组,然后从中构造一个字符
字符串
- 使用正则表达式的
-此方法经过优化,可处理几乎无限大小的字符串替换
- 滚动您自己的算法-创建一个与原始字符串长度相对应的
字符数组。遍历字符串,并将希望保留的字符添加到数组中。用于立即构造字符串
- 使用
-与每次添加字符时构造新对象的字符串连接不同,这种方法将正在构造的字符串扩展为更大的块,防止过多的垃圾创建StringBuilder
- 将LINQ的过滤与
-这种方法在一次快照中构造一个一起使用,其中
数组,然后从中构造一个字符
字符串
- 使用正则表达式的
Replace