文字列に部分文字列を挿入するのに問題があります。文字列パスに挿入する必要が"/thumbs"
あります
/media/pictures/image1.jpg
次のように、パスの最後の部分に/thumbs/を挿入します。
/media/pictures/thumbs/image1.jpg
linqで可能ですか?
パス操作のようなものについては、System.IO
名前空間、特にPath
オブジェクトを使用するのが最善です。次のようなことができます。
string path = "/media/pictures/image1.jpg";
string newPath = Path.Combine(Path.GetDirectoryName(path), "thumbs", Path.GetFileName(path)).Replace(@"\", "/");
これを試してください。最後のスラッシュのインデックスを取得し、その時点に追加の文字列を挿入します。
なぜ反対票を投じるのかはわかりませんが、うまくいくことは保証します。
string original = "/media/pictures/image1.jpg";
string insert = "thumbs/";
string combined = original.Insert(original.LastIndexOf("/") + 1, insert);
linqで可能ですか?
このプロセスにLinqを使用する必要はありません。String.Insert()メソッドを使用できます。
このインスタンスの指定されたインデックス位置に指定された文字列が挿入された新しい文字列を返します。
string s = "/media/pictures/image1.jpg";
string result = s.Insert(s.LastIndexOf('/'), "/thumbs");
Console.WriteLine(result);
出力;
/media/pictures/thumbs/image1.jpg
ここにデモがあります。
と呼ばれるSystem.IOクラスを使用しますPath
。
これは、デモンストレーションのみを目的としたlong(er)バージョンです。
string pathToImage = "/media/pictures/image1.jpg";
string dirName = System.IO.Path.GetDirectoryName(pathToImage);
string fileName = System.IO.Path.GetFileName(pathToImage);
string thumbImage = System.IO.Path.Combine(dirName, "thumb", fileName);
Debug.WriteLine("dirName: " + dirName);
Debug.WriteLine("fileName: " + fileName);
Debug.WriteLine("thumbImage: " + thumbImage);
これがワンライナーです:
Debug.WriteLine("ShortHand: " + Path.Combine(Path.GetDirectoryName(pathToImage), "thumb", Path.GetFileName(pathToImage)));
次の出力が得られます。
dirName: \media\pictures
fileName: image1.jpg
thumbImage: \media\pictures\thumb\image1.jpg
ShortHand: \media\pictures\thumb\image1.jpg
Pathクラスを、できれば独自のユーティリティ メソッドで、または拡張メソッドとして使用します。
string pathWithThumbs = Path.Combine(Path.Combine(Path.GetDirectoryName(path), "thumbs"), Path.GetFileName(path));
Linq はここでは場違いのようです。コレクションを実際にクエリしているわけではありません。さらに、このPath
クラスは、ほとんどのスラッシュとコーナー ケースを自動的に処理します。
編集: @juharr が指摘したように、4.0 の時点で、さらに簡単にする便利なオーバーロードがあります。
string pathWithThumbs = Path.Combine(Path.GetDirectoryName(path), "thumbs", Path.GetFileName(path));
EDITx2:@DiskJunkyが指摘しているように、このパスの使用法は実際にはスラッシュをバックスラッシュに交換するのでReplace("\\", "/")
、そこに呼び出しを投げるだけです.