2013-02-18 4 views
3

У меня неприятности вставить подстроку в строке то, что я хочу, чтобы ввести "/thumbs" в stringpathВставить строку в строку

/media/pictures/image1.jpg 

Я хочу, чтобы ввести/палец/в последнюю часть пути например:

/media/pictures/thumbs/image1.jpg 

Возможно ли с помощью linq?

+3

Почему вы используете linq, а не только метод String Insert? –

+0

Зачем вам использовать ссылку, а не только хороший класс утилиты «Путь», предназначенный для того, чтобы помочь делать вещи именно так? 'string pathWithThumbs = Path.Combine (Path.Combine (Path.GetDirectoryName (path)," thumbs "), Path.GetFileName (путь));' –

+1

простая проверка для последнего/(или первого с конца), а затем вставка/thumbs – exexzian

ответ

1

Я хотел бы использовать Path класс, предпочтительно в своем собственном методе полезности или как метод расширения.

string pathWithThumbs = Path.Combine(Path.Combine(Path.GetDirectoryName(path), "thumbs"), Path.GetFileName(path)); 

Linq кажется неуместным здесь; вы действительно не запрашиваете коллекции. Кроме того, класс Path обрабатывает большую часть разрезов и угловых случаев для вас автоматически.

EDIT: Как @juharr отметил, что 4.0 есть удобная перегрузка, что делает его еще проще:

string pathWithThumbs = Path.Combine(Path.GetDirectoryName(path), "thumbs", Path.GetFileName(path)); 

EDITx2: Hrrrm как @DiskJunky указывает, это использование Путь будет фактически поменять местами слеша для обратных косых черт, так что просто бросьте вызов Replace("\\", "/").

+0

'Path.Combine' теперь возьмет массив параметров, поэтому вам не нужно вставлять их. Я думаю, что это было добавлено в .Net 4.0. – juharr

+0

@juharr Спасибо! Прошло много времени с тех пор, как мне пришлось погрузиться в непосредственное использование «Пути»; очень приятная перегрузка! –

+1

Результат вашего решения заменяет «/» на «\» - вам нужно заполнить его вызовом Replace() в конце цепочки. – DiskJunky

3

Попробуйте это, вы получите индекс последней косой черты и вставьте дополнительную строку в эту точку.

Неуверенный относительно почему downvote, но я уверяю, что это работает.

string original = "/media/pictures/image1.jpg"; 
string insert = "thumbs/"; 
string combined = original.Insert(original.LastIndexOf("/") + 1, insert); 
+0

Я не голосовал, но я предполагаю, что это «вы должны использовать методы' Path' вместо аргументов 'string' methods. – juharr

+0

Скорее всего, но это немного похоже на такую ​​простую операцию IMO. 'string.Insert' существует по какой-то причине;) –

+1

Да, и я не уверен, что методы Path будут держать косые черты правильными./vs \ – juharr

2

Возможно ли с помощью 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 

Вот DEMO.

+0

Что даст /media/pictures/thumbs//image1.jpg, вам нужно удалить одну из косых черт. –

+0

@AdamKDean Ups, спасибо! Исправлена. –

4

Для чего-то вроде манипуляции с дорогой, лучше всего использовать пространство имен System.IO, в частности объект Path. Вы можете сделать что-то вроде;

string path = "/media/pictures/image1.jpg"; 
string newPath = Path.Combine(Path.GetDirectoryName(path), "thumbs", Path.GetFileName(path)).Replace(@"\", "/"); 
1

Я бы использовал класс System.IO под названием Path.

Вот длинный (вдовцы) версия для демонстрационных целей только:

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 
Смежные вопросы