2012-12-27 26 views
6

Tôi có một số StringBuilder tích lũy mã không. Trong một số trường hợp, nó có 2 dòng trống giữa các khối mã và tôi muốn tạo 1 dòng trống đó.
Làm cách nào để kiểm tra xem mã hiện tại đã có dòng trống ở cuối? (Tôi không muốn sử dụng phương pháp ToString() do các vấn đề về hiệu suất.)C# StringBuilder: Kiểm tra xem nó có kết thúc bằng một dòng mới

+0

Bạn sẽ phải kiểm tra các dòng/khối khi bạn thêm chúng - hoặc thay thế tất cả "dòng kép mới" bằng một dòng duy nhất và cắt đầu. –

+1

Có thể sử dụng Thay thế và thay thế bất kỳ sự xuất hiện nào của hai Môi trường.NewLine bằng một Môi trường.NewLine (ở cuối tòa nhà). một khả năng khác là ToString (dài-1,1) để có được nhân vật cuối cùng. –

+0

Đây là những gì tôi đã làm cuối cùng. Nó đã được đăng dưới dạng câu trả lời nhưng đã bị xóa vì ai đó đã đề cập rằng nó cũng sẽ xóa hai dòng mới ở giữa mã. Nó thực sự không quan trọng với tôi, vì vậy nếu giải pháp này sẽ được đăng như một câu trả lời, tôi sẽ đánh dấu nó. – Noich

Trả lời

-1

Vì tôi không quan tâm đến 2 dòng trống ở giữa của mã này, cách đơn giản nhất là sử dụng

myCode.Replace(string.Format("{0}{0}", Environment.NewLine),Environment.NewLine); 

Tùy chọn này không đòi hỏi bất kỳ thay đổi đến các lớp học mà sử dụng mã tích lũy.

+0

Điều đó sẽ không hoạt động nếu 'myCode' không sử dụng' Environment.NewLine' làm dấu tách dòng. Ngoài ra, điều này không hiệu quả hơn là 'ToString'. –

6

Bạn có thể truy cập bất kỳ ký tự nào trong số StringBuilder bằng chỉ mục của nó, như bạn làm với String.

var sb = new StringBuilder(); 
sb.Append("Hello world!\n"); 
Console.WriteLine(sb[sb.Length - 1] == '\n'); // True 
+0

Tôi đang nói về khối mã rất lớn. Tôi đã thử kiểm tra các ký tự hoàn thiện nhưng nó đã lộn xộn. – Noich

0

Trong một số trường hợp, nó có 2 dòng trống giữa các khối mã, và tôi muốn làm cho điều đó 1 dòng trống [...] Tôi không thích sử dụng phương pháp của nó ToString() vì vấn đề hiệu năng.

Trước hết, bạn nên tự hỏi tại sao dòng mới lại ở đó. Nếu bạn có thể kiểm soát đầu vào trong khi thêm văn bản, bạn có thể dễ dàng xác định có bao nhiêu đi vào được nhập:

void AddToStringBuilder(string input) 
{ 
    input = input.TrimStart('\r', '\n'); 
    input = input.TrimEnd('\r', '\n'); 

    _stringBuilder.AppendLine(input); 
} 

Hoặc, nếu bạn muốn nhìn vào phần bổ sung trước đó mà không gọi ToString():

string _previousInput = null; 

void AddToStringBuilder(string input) 
{ 
    if (!String.IsNullOrEmpty(_previousInput) 
     && _previousInput.EnsWith('\n')) 
    { 
     _stringBuilder.Append(input); 
    } 
    else 
    { 
     _stringBuilder.AppendLine(input); 
    } 

    _previousInput = input;  
} 
2

Bạn có thể bình thường hóa các dòng mới, sử dụng một regex:

var test = @"hello 

moop 

hello"; 

var regex = new Regex(@"(?:\r\n|[\r\n])+"); 

var newLinesNormalized = regex.Replace(test, Environment.NewLine); 

đầu ra:

hello 
moop 
hello 
+1

Làm thế nào điều này liên quan đến 'StringBuilder'? –

1

Đây là ví dụ hoàn chỉnh.

class string_builder 
{ 
    string previousvalue = null; 
    StringBuilder sB; 
    public string_builder() 
    { 
     sB = new StringBuilder(); 
    } 
    public void AppendToStringBuilder(string new_val) 
    { 
     if (previousvalue.EndsWith("\n") && !String.IsNullOrEmpty(previousvalue)) 
     { 
      sB.Append(new_val); 
     } 
     else 
     { 
      sB.AppendLine(new_val); 
     } 

     previousvalue = new_val; 
    } 

} 
class Program 
{ 

    public static void Main(string[] args) 
    { 
     string_builder sb = new string_builder();    
     sb.AppendToStringBuilder("this is line1\n"); 
     sb.AppendToStringBuilder("this is line2"); 
     sb.AppendToStringBuilder("\nthis is line3\n"); 

    }    
} 
+0

Điều này sẽ yêu cầu thay đổi lớn trong mã của tôi - Tôi muốn giữ các thay đổi ở mức tối thiểu. Cảm ơn cho các mẫu mã mặc dù. – Noich

0

Trong trường hợp bất kỳ ai kết thúc ở đây như tôi đã làm ở đây là phương pháp chung để kiểm tra kết thúc của StringBuilder cho chuỗi tùy ý có sử dụng ToString trên đó.

public static bool EndsWith(this StringBuilder haystack, string needle) 
{ 
    var needleLength = needle.Length - 1; 
    var haystackLength = haystack.Length - 1; 
    if (haystackLength < needleLength) 
    { 
     return false; 
    } 
    for (int i = 0; i < needleLength; i++) 
    { 
     if (haystack[haystackLength - i] != needle[needleLength - i]) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
2

Kiểm tra một dòng. Sử dụng một kiểu chuỗi, không phải StringBuilder, nhưng bạn sẽ nhận được ý tưởng cơ bản.

if (theString.Substring(theString.Length - Environment.NewLine.Length, Environment.NewLine.Length).Contains(Environment.NewLine)) 
{ 
    //theString does end with a NewLine 
} 
else 
{ 
    //theString does NOT end with a NewLine 
} 
Các vấn đề liên quan