2012-11-26 28 views
0

這是我的代碼:C#子拋出一個異常

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

+3

什麼是例外?還有,你通過什麼路徑? –

+7

首先檢查是否存在'-'? –

+0

這是:「system.argumentoutofrangeexception指數和長度必須指字符串中的位置」 – 02446

回答

7

您正在使用的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(); 
0

我不知道你的例外是什麼,但我假設-不存在於你的字符串中。

如果審查String.IndexOfhere的機制的文檔,你會看到:

的價值從零開始的索引位置,如果該字符串被發現,或者-1如果不是

當您使用-1開始索引執行subString時,它將引發異常。

我會檢查的-第一的存在,那麼,如果發現做你的子:

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

首先,你應該告訴我們你的異常是什麼。這將有助於

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

看起來像它會拋出一個異常,因爲它會嘗試超過長度的子字符串。

嘗試

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

代替

1

Substring(int index, int length),在length應該是串的長度,而不是整個字符串的長度。

你想:

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

的第二個參數的方法String.Substring是串的長度。在這種情況下,子字符串的長度應該總是比第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(); 
} 
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(); 
} 
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; 
} 

更清潔。

+1

我不會稱這個清潔工。此外,如果這應該像問題一樣工作,如果不存在,則應該返回'pth'而不是'null'。 – Magnus

+0

好吧,絕對少檢查各種長度和擔心字符串偏移。我猜如果你不習慣正則表達式,它可能會更復雜。關於返回'null'的好處。 –

-1

您可以使用LINQ如下:

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

我看不出這是如何回答這個問題的...... – Matt