这是我的代码:
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
,但它也没有用。
答案 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));