C#substring抛出异常

时间:2012-11-26 17:51:23

标签: c# .net string

这是我的代码:

private string title(string pth) //I'm passing a path
{
    pth = System.IO.Path.GetFileNameWithoutExtension(pth); // I need an exact filename with no extension
    return pth.Substring(pth.IndexOf('-')+1, pth.Length).Trim(); // trying to return everything after '-'
}

它会引发异常。我不知道为什么。这是从文件名中获取标题的一种非常简单的方法,但它不起作用。

我已经尝试了pth.Length-1,但它也没有用。

9 个答案:

答案 0 :(得分:8)

您正在使用允许您指定要提取的字符数的String.Substring method版本。

但是,您提供length参数作为字符串本身的整个长度 - 因此ArgumentOutOfRangeException

如果您使用this version of String.Substring,则可以提供单个参数(startIndex),并且您将自动获取字符串的其余部分,从您提供的索引开始。

所以你可以改变你的代码:

return pth.Substring(pth.IndexOf('-')+1, pth.Length).Trim();

对此:

return pth.Substring(pth.IndexOf('-')+1).Trim();

答案 1 :(得分:2)

Substring(int index, int length)length应该是子字符串的长度,而不是整个字符串的长度。

你想:

int index = pth.IndexOf('-');
return pth.Substring(index + 1, pth.Length - index - 1);

答案 2 :(得分:1)

问题是您正在尝试检索比您指定的长度短的子字符串。此外,如果字符'-'位于字符串的末尾,您将获得异常,因为index+1将位于字符串之外。 这将有所帮助:

private string title(string pth) //I'm passing a path
    {
        pth = System.IO.Path.GetFileNameWithoutExtension(pth); // I need an exact filename with no extension
        string retStr = string.Empty;
        if(pth.IndexOf('-')<pth.Length-1)
        {
              retStr = pth.Substring(pth.IndexOf('-')+1).Trim(); // trying to return everything after '-'
        }
        return retStr;
    }

答案 3 :(得分:1)

在这种情况下,我建议使用正则表达式。类似的东西:

private static string title(string pth)
{
   pth = System.IO.Path.GetFileNameWithoutExtension(pth); // I need an exact filename with no extension
   Match m = Regex.Match(pth, @".*\-(?<suffix>.*)$");

   Group suffix = m.Groups["suffix"];
   return suffix.Success ? suffix.Value : pth;
}

更干净。

答案 4 :(得分:0)

我不知道您的异常是什么,但我假设您的字符串中不存在-

如果您查看String.IndexOf here的文档,您会看到:

  

如果找到该字符串,则从零开始的索引位置值,如果不是

,则为-1

当你使用subString起始索引执行-1时,它会抛出异常。

我先检查是否存在-,然后检查是否存在你的子串:

if(pth.IndexOf('-') != -1)
{
    //Substring code
}

答案 5 :(得分:0)

首先,您应该告诉我们您的例外情况。这会有所帮助

pth.Substring(pth.IndexOf('-')+1, pth.Length)  

看起来会引发异常,因为它会尝试超出长度的子字符串。

尝试

pth.Substring(pth.IndexOf('-')+1)

代替

答案 6 :(得分:0)

String.Substring方法的第二个参数是子字符串的长度。在这种情况下,子字符串的长度应始终 less ,而不是第p个字符串的长度。你可能打算这样做:

private string title(string pth) //I'm passing a path
{
    pth = System.IO.Path.GetFileNameWithoutExtension(pth);
    return pth.Substring(pth.IndexOf('-')+1, pth.Length - pth.IndexOf('-') - 1).Trim();
}

答案 7 :(得分:0)

您需要像这样更改代码:

private string title(string pth) //I'm passing a path
{
  pth = System.IO.Path.GetFileNameWithoutExtension(pth);
  var indexOfDash = pth.IndexOf('-') + 1; // Add this line
  return pth.Substring(indexOfDash, pth.Length - indexOfDash).Trim();
}

答案 8 :(得分:-1)

您可以使用LINQ,如下所示:

string someString = "abcde";
string subStr = string.Join("", someString.Take(240));