2011-08-24 15 views
17

Me encanta usar @ "cadenas" en C#, especialmente cuando tengo un montón de texto de varias líneas. La única molestia es que el formato de mi código va a doodie cuando hago esto, porque la segunda y las líneas más grandes se empujan completamente hacia la izquierda en lugar de usar la sangría de mi código bellamente formateado. Sé que esto es por diseño, pero ¿hay alguna forma de hack/opción para permitir que estas líneas se sangren, sin agregar las pestañas/espacios reales a la salida?formateo de líneas múltiples para cadenas verbatim en C# (prefijo con @)

añadiendo ejemplo:

 var MyString = @" this is 
a multi-line string 
in c#."; 

Mi declaración de variables se sangra a la profundidad "correcta", pero el segundo y siguientes líneas en la cadena de quedarse relegados a la izquierda marginalmente por lo que el código es un poco feo. Podría agregar pestañas al comienzo de la línea 2 y 3, pero la cadena en sí misma contendría esas pestañas ... ¿tiene sentido?

+0

puede dar un ejemplo !? – gideon

+1

Lo que normalmente hago es iniciar la cadena en su propia línea (es decir, nueva línea antes del '@'), por lo que al menos no está a la derecha y de repente a la izquierda. Sé que no es la solución que buscas. –

+0

Sí, a menudo hago eso también. Y realmente no es un gran problema, pero pensé que sería una pregunta interesante para hacer. –

Respuesta

9

¿Qué tal una extensión de cuerda? Actualización: volví a leer su pregunta y espero que haya una mejor respuesta. Esto es algo que también me molesta y tener que resolverlo de la siguiente manera es frustrante, pero desde el punto de vista positivo funciona.

using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    public static class StringExtensions 
    { 
     public static string StripLeadingWhitespace(this string s) 
     { 
      Regex r = new Regex(@"^\s+", RegexOptions.Multiline); 
      return r.Replace(s, string.Empty); 
     } 
    } 
} 

Y un programa de ejemplo de la consola:

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string x = @"This is a test 
       of the emergency 
       broadcasting system."; 

      Console.WriteLine(x); 

      Console.WriteLine(); 
      Console.WriteLine("---"); 
      Console.WriteLine(); 

      Console.WriteLine(x.StripLeadingWhitespace()); 

      Console.ReadKey(); 
     } 
    } 
} 

Y la salida:

This is a test 
       of the emergency 
       broadcasting system. 

--- 

This is a test 
of the emergency 
broadcasting system. 

Y una forma más limpia de usarlo si usted decide ir a esta ruta:

string x = @"This is a test 
    of the emergency 
    broadcasting system.".StripLeadingWhitespace(); 
// consider renaming extension to say TrimIndent() or similar if used this way 
+0

Sí, esta es una solución en la que estaba pensando. Puede que necesite agregar inteligencia para quitar solo un cierto número de espacios o pestañas, ya que ES POSIBLE que desee un espacio/pestaña en algunas líneas;) –

+0

Y tal vez verifique si la cadena comienza con cualquier espacio en blanco y de manera predeterminada reemplaza '^ \ s + 'con esa cantidad de espacios en blanco si es así? – Cymen

2

No puedo pensar en una respuesta que satisfaga completamente su pregunta, sin embargo, podría escribir una función que elimine los espacios iniciales de las líneas de texto contenidas en una cadena y llamarlo en cada creación de dicha cadena.

var myString = TrimLeadingSpacesOfLines(@" this is a 
    a multi-line string 
    in c#."); 

Sí, es un truco, pero ha especificado su aceptación de un truco en su pregunta.

+0

el truco es: es posible que desee algunos espacios en blanco iniciales en algunas situaciones, por lo que solo quiero que se elimine suficiente espacio en blanco para que el texto toque el margen izquierdo ... ¿tiene sentido? –

4

Cymen ha dado la solución correcta. Utilizo un enfoque similar al derivado del método stripMargin() de Scala. Esto es lo que mi método de extensión se ve así:

public static string StripMargin(this string s) 
{ 
    return Regex.Replace(s, @"[ \t]+\|", string.Empty); 
} 

Uso:

var mystring = @" 
     |SELECT 
     | * 
     |FROM 
     | SomeTable 
     |WHERE 
     | SomeColumn IS NOT NULL" 
    .StripMargin(); 

Resultado:

SELECT 
    * 
FROM 
    SomeTable 
WHERE 
    SomeColumn IS NOT NULL 
Cuestiones relacionadas