2011-08-24 18 views
17

Uwielbiam używać ciągów @ "w języku C#, zwłaszcza gdy mam dużo tekstu wielowierszowego. Jedyną uciążliwością jest to, że moje formatowanie kodu przechodzi do doodie, kiedy to robię, ponieważ druga i większa linia są przesunięte całkowicie w lewo zamiast używania wcięcia mojego pięknie sformatowanego kodu. Wiem, że jest to zgodne z projektem, ale czy istnieje sposób wybrania opcji/hackowania pozwalający na wcięcie tych linii bez dodawania rzeczywistych zakładek/spacji do wyjścia?Formatowanie wielowierszowe dla ciągów znaków w C# (prefiks z @)

dodanie przykład:

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

Moja deklaracja zmiennej jest wcięty do „właściwej” głębokości, ale drugi i kolejne linie w ciągu Popadam w lewo margin- więc kod jest trochę brzydki. Możesz dodać zakładki na początku linii 2 i 3, ale sam ciąg będzie zawierał te karty ... ma sens?

+0

można podać przykład !? – gideon

+1

To, co normalnie robię, to rozpoczynanie łańcucha na osobnej linii (tj. Znak nowej linii przed znakiem @), więc przynajmniej nie jest po prawej, a następnie nagle po lewej stronie. Wiem, że to nie jest rozwiązanie, na które się natkniesz. –

+0

Tak, często też to robię. I to naprawdę nie jest wielka sprawa, ale pomyślałem, że byłoby to interesujące pytanie. –

Odpowiedz

9

Co powiesz na przedłużenie napisu? Aktualizacja: Ponownie przeczytałem twoje pytanie i mam nadzieję, że jest lepsza odpowiedź. To jest też coś, co mnie niszczy, a rozwiązanie tego problemu jest frustrujące, ale z drugiej strony działa.

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); 
     } 
    } 
} 

i program przykład konsola:

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(); 
     } 
    } 
} 

a wyjście:

This is a test 
       of the emergency 
       broadcasting system. 

--- 

This is a test 
of the emergency 
broadcasting system. 

i czystszy sposób go używać, jeśli zdecydujesz się pójść tą drogą:

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

tak, to jest rozwiązanie, o którym myślałem. Może dodać inteligencję, aby usunąć tylko pewną liczbę spacji lub zakładek, ponieważ jest to możliwe, że potrzebujesz spacji/tabulacji w niektórych liniach;) –

+0

A może sprawdź, czy ciąg zaczyna się od białych znaków i domyślnie zastępuje '^ \ s + 'z tą ilością białych znaków, jeśli tak? – Cymen

2

Nie mogę wymyślić odpowiedzi, która całkowicie zaspokoi twoje pytanie, możesz jednak napisać funkcję, która usunie wiodące spacje z linii tekstu zawartego w ciągu i wywoła go na każdym utworzeniu takiego ciągu.

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

Tak, to jest hack, ale wyraziłeś zgodę na włamanie do twojego pytania.

+0

Połów jest - w niektórych sytuacjach mogę chcieć niektórych pustych pól, więc chcę tylko tyle wolnego miejsca, aby tekst trafił na lewy margines ... sens? –

4

Cymen podał właściwe rozwiązanie. Używam podobnego podejścia, jak wywodzi się z metody stripMargin() firmy Scala. Oto co moja metoda rozszerzenie wygląda następująco:

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

Zastosowanie:

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

Wynik:

SELECT 
    * 
FROM 
    SomeTable 
WHERE 
    SomeColumn IS NOT NULL