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
    return pth.Substring(pth.IndexOf('-')+1, pth.Length).Trim(); // trying to return everything after '-'
}

例外をスローします。理由がわかりません。ファイル名からタイトルを取得するのは非常に簡単な方法ですが、機能しません。

試しましたが、うまくいきませpth.Length-1ん。

4

8 に答える 8

9

抽出する文字数を指定できるバージョンのString.Substringメソッドを使用しています。

ただし、lengthパラメータは文字列自体の全長として指定しているため、ArgumentOutOfRangeException

このバージョンのString.Substringを使用する場合は、単一のパラメーター(startIndex)を指定すると、指定したインデックスから始まる文字列の残りの部分が自動的に取得されます。

したがって、これからコードを変更できます。

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

これに:

return pth.Substring(pth.IndexOf('-')+1).Trim();
于 2012-11-26T17:55:59.030 に答える
2

Substring(int index, int length)、はlength、文字列全体の長さではなく、部分文字列の長さである必要があります。

あなたが欲しい:

int index = pth.IndexOf('-');
return pth.Substring(index + 1, pth.Length - index - 1);
于 2012-11-26T17:56:29.670 に答える
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;
    }
于 2012-11-26T17:56:38.243 に答える
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;
}

はるかにきれい。

于 2012-11-26T18:00:51.603 に答える
0

あなたの例外が何であるかはわかりませんが、それ-はあなたの文字列には存在しないと思います。

String.IndexOf ここのドキュメントを確認すると、次のように表示されます。

その文字列が見つかった場合は値のゼロベースのインデックス位置、見つからない場合は-1

開始インデックスを使用してを実行するsubStringと、例外がスローされます。-1

最初に存在するかどうかを確認し、-見つかった場合はサブストリングを実行します。

if(pth.IndexOf('-') != -1)
{
    //Substring code
}
于 2012-11-26T17:56:07.143 に答える
0

まず、例外を教えてください。それは助けになります

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

長さを超える部分文字列を取得しようとするため、例外がスローされるようです。

試す

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

代わりは

于 2012-11-26T17:56:19.577 に答える
0

String.Substringメソッドの2番目のパラメーターは、サブストリングの長さです。この場合の部分文字列の長さは、常に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();
}
于 2012-11-26T17:57:49.173 に答える
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();
}
于 2012-11-26T18:00:32.357 に答える