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
Trả lời
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.
Đ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'. –
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
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
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;
}
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
Làm thế nào điều này liên quan đến 'StringBuilder'? –
Đâ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");
}
}
Đ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
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;
}
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
}
- 1. Kiểm tra xem char có phải là một dòng mới
- 2. Kiểm tra xem chuỗi có bắt đầu bằng hoặc kết thúc bằng một chuỗi khác
- 3. Kiểm tra xem một chuỗi có kết thúc bằng một số trong PHP
- 4. Cách phát hiện tệp kết thúc bằng dòng mới?
- 5. Kiểm tra xem chuỗi có kết thúc bằng một trong các chuỗi từ danh sách
- 6. Kiểm tra xem chuỗi có kết thúc bằng một cái gì đó với Java (Regex)
- 7. Regex để kiểm tra xem chuỗi có kết thúc bằng số
- 8. Kiểm tra xem chuỗi có kết thúc bằng chuỗi đã cho trong clojure
- 9. Kết thúc dòng (dòng mới) thoát trong bash
- 10. Làm thế nào tôi có thể kiểm tra xem một chuỗi kết thúc với ".csv" trong C
- 11. Cách kiểm tra xem chuỗi có bắt đầu bằng một chuỗi khác trong C không?
- 12. SVN: "Kiểu kết thúc dòng không nhất quán" - Kiểm tra tệp có^M cố ý
- 13. Cách kiểm tra khi nào Shell32.Folder.CopyHere() kết thúc
- 14. Kiểm tra xem ID có bằng
- 15. Ký tự dòng mới không hoạt động khi định dạng email bằng StringBuilder
- 16. Cách kiểm tra xem bạn có kết nối internet trực tiếp bằng cách sử dụng C++
- 17. Làm cách nào để kiểm tra xem kết quả SQL có chứa ký tự dòng mới không?
- 18. python: cách kiểm tra xem một dòng có phải là một dòng trống không
- 19. Dòng kết thúc SVN
- 20. Codec Python dòng kết thúc
- 21. Kiểm tra xem con trỏ có kết quả
- 22. Làm thế nào để phát hiện nếu một chuỗi có một ngắt dòng mới trong nó?
- 23. Kiểm tra xem 3 điểm trên cùng một dòng
- 24. Kiểm tra xem liên kết có nằm trong hoặc ngoài
- 25. Kiểm tra kết nối FTP bằng Python
- 26. Cách kiểm tra thư mục để kiểm tra xem tệp mới có được thêm vào không?
- 27. Làm cách nào để liệt kê các tệp không kết thúc bằng dòng mới?
- 28. Kiểm tra Hiệu suất Trang Web Kết thúc Trước
- 29. Kiểm tra xem kết nối ADODB có đang mở không
- 30. Cách kiểm tra xem một dòng có một trong các chuỗi trong danh sách không?
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. –
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. –
Đâ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