【问题标题】:Index and length must refer to a location within the string索引和长度必须引用字符串中的位置
【发布时间】:2011-11-29 11:18:14
【问题描述】:

我正在尝试将字符串切割成 6 个字段,每个字段的最大长度为 30。字符串的总长度为 173。我创建了如下代码;

(
(("" + dr["MESSAGE"]).ToString().Trim().Length<30 && 
("" + dr["MESSAGE"]) != "")?(("" + dr["MESSAGE"]) + "|||||") : 
(("" + dr["MESSAGE"]).ToString().Trim().Length>150 && 
("" + dr["MESSAGE"]).ToString().Trim().Length<181)?
(("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(0,30).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(31,60).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(61,90).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(91,120).Trim() + "|"  + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(121,150).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(151,180).Trim()) : "" + "|||||")

代码本身会生成一个输出文件,但没有数据。我得到的只是页眉和页脚,错误“索引和长度必须引用字符串中的位置”,在输出文件的底部指示。

感谢您帮助解决我的问题。

【问题讨论】:

  • 在某处你已经超越了字符串的边界。但是你“编写”代码的方式让你(和我们)几乎没有关于代码哪里出错的线索。将您的代码分成几行和几个阶段。您将能够准确地看到错误在哪里。
  • 也许你应该考虑让你的代码更具可读性。

标签: asp.net


【解决方案1】:

你自己说的,

字符串的总长度为 173。

还在这里

().PadRight(180,' ').Substring(151,180).Trim()) 

您正在尝试创建一个子字符串,该子字符串可以访问最多 180 个字符的数据...。它比您的 173 长度的字符串长。

【讨论】:

  • 我之所以放180是因为用户可以放的最大总长度是180。由于我不知道用户输入的字符串的实际长度,所以我在填充字符串只要 时,空格直到 180
  • 啊,好点子!我有一个可能的想法是将字符串填充到 180 个字符,但是当您使用子字符串时索引从 0 开始(只是想在这里我无法测试)所以 0 - 179 是 180 个字符。即访问 180 是 1 个字符太多
  • @Purplegoldfish...那我应该用 179 替换 180 吗?
【解决方案2】:

我认为您对子字符串的工作方式有误。

第二个参数是要提取的字符串的长度,而不是要结束的索引 - MSDN Ref

参数

startIndex 类型:System.Int32 从零开始的起始字符 此实例中子字符串的位置。
长度类型:System.Int32 子字符串中的字符数。

您想为第二个参数指定 30,因为您想将其拆分为 30 个字符块。

我认为这应该可行(但代码确实需要整理!):

((dr["MESSAGE"].ToString().Trim().Length < 30 && test != "")
    ? (dr["MESSAGE"].ToString() + "|||||")
    : (dr["MESSAGE"].ToString().Trim().Length > 150 && test.Trim().Length < 181)
        ? dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(0, 30).Trim() + "|" +
            dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(30, 30).Trim() + "|" +
            dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(60, 30).Trim() + "|" +
            dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(90, 30).Trim() + "|" +
            dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(120, 30).Trim() + "|" +
            dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(150, 30).Trim()
        : "|||||");

这个问题 - Splitting a string / number every Nth Character / Number? 可能会帮助您编写更好的代码

【讨论】:

  • 感谢 Richard D。不幸的是,除了每行表达式,我无法进行任何编码。我们的供应商为我提供了一个工具,可以按照我需要的格式从数据库中生成一个输出文件。但是该工具只允许我进行类似于给定的编码。我已经尝试过您的代码,但仍然得到相同的结果。
  • @andiecruz 我已经整理了示例并在本地对其进行了测试,它似乎可以工作。你能再试一次,让我知道它是否适合你吗?似乎有太多可能导致问题的括号。
  • @RichardD..​​.不幸的是,括号在供应商创建的系统代码中具有一些功能。我已经尝试使用您的代码,但它仍然无法正常工作。
  • 我会写出 dr["MESSAGE"] 的典型值的转储。并通过一个由上述代码组成的测试工具,写得更清楚。然后你可以找到抛出了哪些值,更重要的是你应该能够逐步计算出代码抛出的确切位置。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多