繁体   English   中英

C#子字符串抛出异常

[英]C# substring throws an exception

这是我的代码:

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 ,但它也不起作用。

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

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

如果使用此版本的String.Substring ,则可以提供一个参数( startIndex ),然后自动从提供的索引处获取其余的字符串。

因此,您可以从此更改代码:

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

对此:

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

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

你要:

int index = pth.IndexOf('-');
return pth.Substring(index + 1, pth.Length - index - 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;
    }

我建议在这种情况下使用正则表达式。 就像是:

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;
}

干净得多。

我不知道您的例外是什么,但我假设这-您的字符串中不存在。

如果在此处查看String.IndexOf的文档,您将看到:

如果找到该字符串,则从零开始的索引位置;如果未找到,则返回-1

当您使用-1开始索引创建subString时,它将引发异常。

我会先检查-的存在,然后如果找到,则执行子字符串:

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

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

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

看起来会抛出异常,因为它将尝试使用超出长度的子字符串。

尝试

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

代替

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

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();
}

您需要像这样更改代码:

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();
}

您可以按以下方式使用LINQ:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM