2011-02-05 11 views
69

Saludos a todos ... Necesito Trim a String. Pero quiero eliminar todos los espacios en blanco repetidos dentro de la Cadena en sí, no solo al final o al comienzo de la misma. Podría hacerlo con un método como:¿Cómo extender los tipos incorporados de C#, como String?

public static string ConvertWhitespacesToSingleSpaces(string value) 
{ 
    value = Regex.Replace(value, @"\s+", " "); 
} 

que me dieron desde here. Pero quiero que se llame a este fragmento de código dentro del propio String.Trim(), así que creo que necesito extender o sobrecargar o anular el método Trim ... ¿Hay alguna manera de hacerlo?

Gracias de antemano.

Respuesta

118

Dado que no puede extender string.Trim(). Puede hacer un método de extensión como se describe en here que recorta y reduce el espacio en blanco.

namespace CustomExtensions 
{ 
    //Extension methods must be defined in a static class 
    public static class StringExtension 
    { 
     // This is the extension method. 
     // The first parameter takes the "this" modifier 
     // and specifies the type for which the method is defined. 
     public static string TrimAndReduce(this string str) 
     { 
      return ConvertWhitespacesToSingleSpaces(str).Trim(); 
     } 

     public static string ConvertWhitespacesToSingleSpaces(this string value) 
     { 
      return Regex.Replace(value, @"\s+", " "); 
     } 
    } 
} 

Se puede utilizar como tal

using CustomExtensions; 

string text = " I'm wearing the cheese. It isn't wearing me! "; 
text = text.TrimAndReduce(); 

Le da

text = "I'm wearing the cheese. It isn't wearing me!"; 
+0

¿El archivo necesita un nombre especial? ¿O dónde guardas esto? ¿Se puede poner en una clase Util o algo así? – testing

+1

@testing Puede colocarlos en cualquier lugar siempre que se mencionen en su proyecto. Si los pones en un espacio de nombre específico, solo tráelos con una declaración 'using' como cualquier otra clase. – Twicetimes

+0

¿por qué no devolvió la expresión regular desde la función TrimAndReduce? hubiera hecho su respuesta mucho más simple de leer.A menos que uses tu respuesta tanto que necesites llamar a otro lugar jajaja – quemeful

20

¿Es posible? Sí, pero solo con un método de extensión

La clase System.String está sellada, por lo que no puede usar la anulación ni la herencia.

public static class MyStringExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
    return Regex.Replace(value, @"\s+", " "); 
    } 
} 

// usage: 
string s = "test !"; 
s = s.ConvertWhitespacesToSingleSpaces(); 
+5

Para ser claros, no, no es posible modificar las acciones que 'String.Trim' toma. –

7

Extension methods!

public static class MyExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
     return Regex.Replace(value, @"\s+", " "); 
    } 
} 
9

Hay un sí y un no a su pregunta.

Sí, puede ampliar los tipos existentes utilizando métodos de extensión. Los métodos de extensión, naturalmente, solo pueden acceder a la interfaz pública del tipo.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...} 

// some time later... 
"hello world".ConvertWhitespacesToSingleSpaces() 

No, no se puede llamar a este método trim(). Los métodos de extensión no participan en la sobrecarga. Creo que un compilador incluso debería darle un mensaje de error detallando esto.

Los métodos de extensión solo son visibles si se usa el espacio de nombre que contiene el tipo que define el método.

2

Además de utilizar los métodos de extensión - probablemente un buen candidato aquí - es también posible de "envolver" un objeto (por ejemplo, "composición de objeto"). Siempre que el formulario envuelto no contenga más información que la que se envuelve, el elemento envuelto puede pasarse limpiamente a través de conversiones implícitas o explícitas sin pérdida de información: solo un cambio de tipo/interfaz.

Happy coding.

Cuestiones relacionadas