【问题标题】:C# Long Substring functionC# 长子字符串函数
【发布时间】:2011-07-14 01:00:19
【问题描述】:

我有一个字符串“可能”比任何简单的 int 边界都长。

目前,string.substring 函数只接受 int 参数作为索引和长度,这对我来说还不够,因为我需要 long 作为参数值类型。

你知道长子串函数的任何实现吗?

或者你建议我做什么来解决这个很长的字符串可能会出现的查找子字符串问题?

谢谢。

【问题讨论】:

  • 这么长的字符串(>2G 字符)会占用 >4GB 内存。您确定 substring 函数将是您唯一的问题吗?
  • 字符串有多长?那么子字符串呢?您可能不想一次将整个字符串加载到内存中,而是在搜索子字符串时使用文件流读取文件的部分内容?
  • 可能的字符串匹配过程可能只发生在内存上,并且机器的可用内存量据说非常大。此操作将处理的字符串是,整个字符串约为 10G 字符,子字符串约为 1000 个字符。我同意,除了资源需求之外,对那个大字符串的任何字符串匹配操作在算法上都是愚蠢的。

标签: c# .net string substring


【解决方案1】:

我有一个“可能”比任何简单的 int 边界都长的字符串。

不,在 .NET 中你不会有这个问题。 System.String 类本身在任何地方都使用Int32 索引和长度属性。

也许您将拥有一个超过 2GB 的 (char) 数组,但已处理好,您可以使用“long”索引。

相关问题:What is the maximum possible length of a .NET string?

【讨论】:

【解决方案2】:

正如 Henk 提供的链接中的答案所示,您不能在 .NET (64-bit also has this restriction) 中创建大小超过 2GB 的对象。

因此无论如何你都不可能有这么大的字符串。你需要使用某种流式算法来查找和隔离你感兴趣的数据。

【讨论】:

    【解决方案3】:

    正如 Henk Holterman 所说,System.String 使用 int32 ....

    但如果需要,使用 unsigned int 可以达到 430 万: 试试 uint。

    uint stringLength =  4,294,967,295
    

    虽然它并没有比正常的 int 高多少

    int -> -2,147,483,648 到 2,147,483,647 uint -> 0 到 4,294,967,295

    【讨论】:

      【解决方案4】:

      此外,传统的子字符串算法在这种规模上可能效果不佳(实际上我不知道 .Substring 是如何工作的)。你可能想看看this

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        • 2014-06-12
        • 2011-05-26
        相关资源
        最近更新 更多