【问题标题】:How do I change a string at position如何在位置更改字符串
【发布时间】:2011-01-19 20:45:52
【问题描述】:

我的目标是速度,必须超快。

        string s = something;
        for (int j = 0; j < s.Length; j++)
        {
            if (s[j] == 'ь')
                if(s.Length>(j+1))
                    if(s[j+1] != 'о')
                        s[j] = 'ъ';

它给了我一个错误错误“不能将属性或索引器'string.this[int]'分配给——它是只读的”

怎样才能最快?

【问题讨论】:

  • 你能解释一下这个过程吗?你的最终目标是什么?
  • 您有什么可能的理由这样做?只是好奇。
  • 最后好像忘记了 }。我认为主要的想法是自动更正俄语单词,因为关于ъь 符号有一些奇怪的规则:)
  • OCR 通常不会将 'ъ' 与 'ь' 区别开来,这很好。俄语中有一条规则,仅在“о”之前声明“ь”。这应该可以解决它,但它必须非常快。
  • 简单的答案?您只是不能修改字符串。如果你需要,那么给你字符串的人必须以可变格式给你......如果他们不这样做,那么你就没有合适的解决方法。

标签: c# chars


【解决方案1】:

快捷方式?使用StringBuilder

最快的方法?始终传递char*length 而不是string,这样您就可以就地修改缓冲区,但请确保永远不要修改任何string 对象。

【讨论】:

  • 某事告诉我这可能是个玩笑,是吗?
  • ...不,不是。是什么让你觉得这是个玩笑?
  • string.toCharArray 然后修改呢?
  • 这既不是首选方式(如StringBuilder)也不是最快方式(如char*);这只是另一种潜在的方法,没有优点也没有缺点。你有什么理由认为char[]StringBuilderchar* 有任何优势?
  • @Lambert - 不是真的 - 只是想知道。它可能适用于他的算法,但我想您对 StringBuilder 的使用会在适当的时候调用 replace ?同意 char* 总是最快的,但想知道 CharArray 是否对于任何查看 C# 代码并在指针位置哭泣的人来说是一个很好的折衷方案。
【解决方案2】:

至少有两种选择:

  • 使用 StringBuilder 并跟踪前一个字符。
  • 您可以只使用正则表达式 "ь(?!о)" 或简单的字符串替换 "ьо",具体取决于您的需求(您的问题似乎自相矛盾)。

我测试了 StringBuilder 方法与正则表达式的性能,差别很小 - 最多为 2:

每秒方法迭代次数 字符串生成器 153480.094 正则表达式(未编译)90021.978 正则表达式(编译)136355.787 字符串。替换 1427605.174

如果性能对您很重要,我会强烈建议您先进行一些性能测量,然后再得出最快的方法是什么的结论。

【讨论】:

  • 正则表达式很好,但不知道够不够快。你能告诉我吗?
  • @John Black:是的,我计时了,我认为它可能足够快。不过,也许您应该为您的特定数据计时。
【解决方案3】:

.Net 中的字符串是只读的。你可以使用StringBuilder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2014-10-07
    • 2012-10-15
    • 2019-06-14
    • 1970-01-01
    • 2023-03-23
    • 2022-10-23
    相关资源
    最近更新 更多