[英]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.