строка c#.заменить в цикле foreach

Как-то я не могу заставить замену строки в цикле foreach в C# работать. Мой код выглядит следующим образом :

foreach (string s in names)
{
    s.Replace("pdf", "txt");
}

Я все еще новичок в LINQ, поэтому извините меня, если это звучит дилетантски;)

5 ответов


вы говорите, что ищете решение LINQ... это просто:

var replacedNames = names.Select(x => x.Replace("pdf", "txt"));

мы не знаем типа names, но если вы хотите назначить ему обратно, вы можете потенциально использовать ToArray или ToList:

// If names is a List<T>
names = names.Select(x => x.Replace("pdf", "txt")).ToList();
// If names is an array
names = names.Select(x => x.Replace("pdf", "txt")).ToArray();

вы должны знать, что код, который вы опубликовали, вообще не использует LINQ на данный момент...


строки в C# неизменяемы (не меняются), поэтому s.Replace возвращает новую строку. К сожалению, это означает, что вы не можете использовать foreach для обновления. Если names является массивом, это должно работать:

for(int i = 0; i < names.Length; i++)
{
    names[i] = names[i].Replace("pdf", "txt");
}

как упоминали другие, вам нужно будет использовать for цикл, чтобы сделать это на месте. Однако, если вам не нужно, чтобы операция выполнялась на месте (т. е. результаты могут быть другой коллекцией), вы также можете сделать это как запрос linq, например

var results = from name in names select name.Replace("pdf", "txt");

одна вещь, хотя-похоже, вы пытаетесь изменить расширение некоторых имен файлов. Если это то, что вы пытаетесь сделать, я бы рекомендовал Path.ChangeExtension которое специфически конструировано для этого цель.

var results = from name in names select Path.ChangeExtension(name, "txt");

s.Replace-это функция, поэтому вы хотели бы s=s.Заменить().. хотя лучше использовать StringBuilder. (см. верхний ответ)


зачем использовать replace, это сделает приложение медленным. Использовать регулярное выражение:

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace.aspx