【问题标题】:Unable to trim the string & get substring within same statement无法修剪字符串并在同一语句中获取子字符串
【发布时间】:2018-12-15 03:09:24
【问题描述】:

我正在从数据库中获取一个长度为 80k 到 90K 个字符的字符串。

我想删除所有前导 white-spaces 并获得大约 50k 个字符的 substring 并将其存储到 StringBuilder 中,因为我必须将其作为参数传递给另一个函数。

代码:

StringBuider sb = new StringBuilder(dr["str"].ToString().TrimStart().SubString(0,50000)); 

但我得到以下异常:

在 mscorlib.dll 中发生了“System.ArgumentOutOfRangeException”类型的未处理异常

附加信息:索引和长度必须引用一个位置 在字符串中。

可以肯定的是,即使在修剪之后,字符串也会有超过 50k 个字符。

如果我先进行修剪然后获取子字符串,那么它工作正常。 背后的原因可能是什么? substring() 不能在即时出现的字符串上执行吗?

【问题讨论】:

  • 不要假设,当您在修剪后调试和检查字符串时,它是否有 50k+ 个字符?子串不这么认为。
  • 如果您要求一个 40,000 个字符长的字符串的前 50,000 个字符,您认为会发生什么? new StringBuilder(dr["str"].ToString().TrimStart().Length 的值是多少?
  • 你误会了@HarshilDoshi。
  • 这是一个循环论证。您声称您的输入超过 50K 个字符。这不是真的。如果您希望进一步继续讨论,请分享new StringBuilder(dr["str"].ToString().TrimStart().Length 的价值。不要猜测,不要讨论,不要假设。运行代码,获取价值并分享。
  • 如果你能制作一个最小的、完整的和可验证的 SubString 行为不正确的演示,我会买一顶帽子吃掉它。

标签: c# .net string substring


【解决方案1】:

似乎并非此表中所有字符串的Length 都是>= 50000(至少不是在TrimStart 之后)。如果字符串较短,则会出现此异常。这样更安全、更易读、更高效:

string str = dr["str"].ToString().TrimStart();
if(str.Length > 50000)
    str = str.Remove(50000); // or Substring(0,50000)
var sb = new StringBuilder(str);

【讨论】:

  • 也更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多