Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除超长字符串中的标点符号_C#_String_Visual Studio - Fatal编程技术网

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