2010-04-26 29 views
7

De alguna manera parece que no puedo obtener el reemplazo de cadena dentro de un bucle foreach en C# para que funcione. Mi código es el siguiente:C# string.replace en el bucle foreach

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

Am todavía bastante nuevo para LINQ por lo que me perdone si esto suena poco profesional;) ​​

Respuesta

30

Usted dice que está buscando una solución LINQ ... eso es fácil:

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

No sabemos el tipo de names, pero si desea asignar de nuevo a él usted podría utilizar ToArray o 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(); 

debe tener en cuenta que el código que has publicado no está usando LINQ para nada en este momento, aunque ...

21

cadenas en C# son inmutables (no cambia), por lo s.Replace volverá una nueva cadena . Lamentablemente, esto significa que no puede usar foreach para hacer la actualización. Si los nombres es una matriz que esto debería funcionar:

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

Se trabajará para una '' Lista también. Simplemente reemplace _Length_ con _Count_ –

0

s.Replace es una función de modo que le gustaría s = s.Replace() .. aunque es mejor utilizar StringBuilder. (Véase la respuesta superior)

+4

¿Por qué usar un StringBuilder sería mejor aquí? No es como si se realizaran varios reemplazos en la cadena * same *. –

3

Como han mencionado otros, necesitarías usar un loop for para hacer esto en su lugar. Sin embargo, si no necesita que la operación se realice en el lugar (es decir, los resultados pueden ser una colección diferente), también podría hacerlo como una consulta de linq, p.

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

Una cosa es que parece que está intentando cambiar la extensión de algunos nombres de archivo. Si eso es lo que estás tratando de hacer, te recomendaría Path.ChangeExtension que está específicamente diseñado para este propósito.

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

El uso de una expresión de consulta aquí parece exagerado: si solo está haciendo una selección única, ¿por qué no llamarla directamente? Sin embargo, +1 para Path.ChangeExtension. –

+0

@Jon - Creo que las expresiones de consulta se ven mejor y son un poco más fáciles de leer. Todo se compila bajo el mismo código, y mecanografía algunos caracteres adicionales realmente no me molesta. Si estaba haciendo algo que no se puede expresar en una consulta, como usar saltar/tomar o convertir a una lista, probablemente usaría los métodos de extensión directamente. –

+0

Supongo que es solo una preferencia personal ... ciertamente me encantan las expresiones de consulta cuando se vuelven más complicadas, pero si solo estás haciendo un solo filtro o una única proyección, parecen una forma menos directa de expresar eso. –

Cuestiones relacionadas