0

我在我的代码中发现了一个错误,其中子字符串不起作用,它说“startIndex 不能大于字符串的长度”

 static int MyIntegerParse(string possibleInt)
    {
        int i;
        return int.TryParse(possibleInt.Substring(2), out i) ? i : 0;        
    }

我在这里使用了程序:

var parsed = File.ReadLines(filename)
            .Select(line => line.Split(' ')     
                .Select(MyIntegerParse)
                .ToArray())
            .ToArray();

但是我不明白为什么会出错,因为我之前已经使用过子字符串并且它可以工作,我可以在这里寻求帮助吗?谢谢。

示例字符串:

10192 20351 30473 40499 50449 60234 
10192 20207 30206 40203 50205 60226 
10192 20252 30312 40376 50334 60252
4

5 回答 5

1

SubstringpossibleInt当包含少于两个字符时将失败,因此您也应该将该测试添加到您的代码中。我怀疑您Split在某些情况下调用会产生一个空字符串。这个空字符串被传递到您的 int-parser 中,然后Substring调用失败。所以,你可能应该做两件事:

  • 摆脱拆分中的空字符串
  • 在解析代码中故意处理短字符串或空字符串

摆脱空字符串很容易:

var parsed = File.ReadLines(filename)
            .Select(line => line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(MyIntegerParse)
                .ToArray())
            .ToArray();

可以像这样添加对空字符串的有意处理:

static int MyIntegerParse(string possibleInt)
{
    if (string.IsNullOrEmpty(possibleInt) || possibleInt.Length < 2)
    { 
        return 0;
    }

    int i;
    return int.TryParse(possibleInt.Substring(2), out i) ? i : 0;        
}

...或者,如果您喜欢紧凑且难以阅读的结构:

static int MyIntegerParse(string possibleInt)
{
    int i;
    return (!string.IsNullOrEmpty(possibleInt) 
        && possibleInt.Length >= 2
        && int.TryParse(possibleInt.Substring(2), out i)) ? i : 0;        
}

0不,当我得到太短的字符串时,我选择返回。Debug.Assert在您的情况下,返回一些其他值、抛出异常或使用语句可能更有意义。

于 2011-04-19T14:13:33.693 回答
0

possibleInt字符串至少需要两个字符长。如果不是,那么您将看到您所描述的错误。

于 2011-04-19T14:13:57.173 回答
0

在您的退货声明之前添加它,看看这是否有助于您弄清楚发生了什么:

Debug.Assert(!string.IsNullOrEmpty(possibleInt) && possibleInt.Length > 2);

在调试模式下运行时,如果不满足上述两种情况,则会抛出异常。

您还可以使用这样的代码合同

Contract.Assert(!string.IsNullOrEmpty(possibleInt) && possibleInt.Length > 2);
于 2011-04-19T14:14:23.473 回答
0

您尝试解析的行并不长。来自Substring的 C# 规范:

The zero-based starting character position of a substring in this instance. 

您传入的字符串中包含 0 或 1 个字符。您需要修改代码来处理这种情况。

编辑:此外,您应该使用拆分重载从文件中删除空元素:

.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntires)
于 2011-04-19T14:14:28.203 回答
0

您收到此异常是因为您试图从大于字符串长度的索引处获取字符串的子字符串。

someString.Substring(x)将为您提供从字符串中someString位置 x 开始的子字符串,它是从零开始的。您收到此异常是因为在这种情况下 2 超出了特定字符串长度的范围。

在它周围加上一个 try catch 或一个断点,你会看到导致这个异常的字符串长度小于 3。

于 2011-04-19T14:17:18.183 回答