2011-08-24 20 views
17

Tôi thích sử dụng @ "strings" trong C#, đặc biệt là khi tôi có nhiều văn bản nhiều dòng. Sự khó chịu duy nhất là định dạng mã của tôi đi vào doodie khi làm điều này, bởi vì các dòng thứ hai và lớn hơn được đẩy hoàn toàn sang bên trái thay vì sử dụng thụt lề của mã định dạng đẹp mắt của tôi. Tôi biết điều này là do thiết kế, nhưng có một số tùy chọn/hack cách cho phép các dòng này được thụt vào, mà không cần thêm các tab/không gian thực tế vào đầu ra?định dạng nhiều dòng cho các chuỗi nguyên văn trong C# (tiền tố có @)

thêm ví dụ:

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

khai báo biến của tôi là thụt vào đến độ sâu "đúng", nhưng dòng thứ hai và tiếp tục trong chuỗi được đẩy sang trái margin- để mã là kinda xấu xí. Bạn có thể thêm các tab vào đầu dòng 2 và 3, nhưng chính chuỗi đó sẽ chứa các tab đó ... có ý nghĩa?

+0

bạn có thể cho một ví dụ !? – gideon

+1

Những gì tôi thường làm là bắt đầu chuỗi trên dòng riêng của nó (tức là dòng mới trước '@'), vì vậy ít nhất nó không ở bên phải rồi đột nhiên ở bên trái. Tôi biết nó không phải là một giải pháp bạn đang mặc dù. –

+0

Có, tôi cũng thường làm như vậy. Và nó thực sự không phải là một vấn đề lớn, nhưng tôi nghĩ đây sẽ là một câu hỏi thú vị để hỏi. –

Trả lời

9

Làm thế nào về một phần mở rộng chuỗi? Cập nhật: Tôi đọc lại câu hỏi của bạn và tôi hy vọng có một câu trả lời tốt hơn. Đây là một cái gì đó mà lỗi tôi quá và phải giải quyết nó như dưới đây là bực bội nhưng về phía cộng nó làm việc.

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

Và một chương trình ví dụ giao diện điều khiển:

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

Và kết quả:

This is a test 
       of the emergency 
       broadcasting system. 

--- 

This is a test 
of the emergency 
broadcasting system. 

Và một cách sạch để sử dụng nó nếu bạn quyết định đi tuyến đường này:

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

vâng đây là một giải pháp tôi đã nghĩ đến. Có thể cần phải thêm trí thông minh để xóa chỉ một số không gian hoặc tab nhất định, vì có thể bạn muốn một không gian/tab trên một số dòng;) –

+0

Và có thể kiểm tra xem chuỗi có bắt đầu với bất kỳ khoảng trắng nào và mặc định thay thế '^ \ s + 'với số lượng khoảng trống đó nếu vậy? – Cymen

2

Tôi không thể nghĩ ra câu trả lời hoàn toàn thỏa mãn câu hỏi của bạn, tuy nhiên bạn có thể viết một hàm ngăn cách các dấu cách hàng đầu từ các dòng văn bản chứa trong một chuỗi và gọi nó trên mỗi chuỗi.

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

Vâng, đó là một hack, nhưng bạn đã chỉ định bạn chấp nhận việc hack trong câu hỏi của bạn.

+0

sản phẩm đánh bắt - Tôi có thể muốn một số không gian trống hàng đầu trong một số trường hợp, vì vậy tôi chỉ muốn có đủ không gian trống để văn bản có thể chạm vào lề trái ... có ý nghĩa? –

4

Cymen đã đưa ra giải pháp đúng. Tôi sử dụng một cách tiếp cận tương tự như được lấy từ phương thức stripMargin() của Scala. Đây là những gì phương pháp khuyến nông của tôi trông giống như:

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

Cách sử dụng:

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

Kết quả:

SELECT 
    * 
FROM 
    SomeTable 
WHERE 
    SomeColumn IS NOT NULL 
Các vấn đề liên quan