Sử dụng LINQ chút và Regex để tìm ra thụt đầu dòng ngắn nhất, sau đó xóa số ký tự đó khỏi tất cả các dòng.
string[] l_lines = {
" public class MyClass",
" {",
" private bool MyMethod(string s)",
" {",
" return s == \"\";",
" }",
" }"
};
int l_smallestIndentation =
l_lines.Min(s => Regex.Match(s, "^\\s*").Value.Length);
string[] l_result =
l_lines.Select(s => s.Substring(l_smallestIndentation))
.ToArray();
foreach (string l_line in l_result)
Console.WriteLine(l_line);
Prints:
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
Chương trình này sẽ quét tất cả các chuỗi trong mảng. Nếu bạn có thể giả định rằng dòng đầu tiên là thụt vào ít nhất, sau đó bạn có thể cải thiện hiệu suất bằng cách quét chỉ dòng đầu tiên:
int l_smallestIndentation =
Regex.Match(l_lines[0], "^\\s*").Value.Length;
Cũng lưu ý rằng điều này sẽ xử lý một ký tự tab ("\t"
) như một nhân vật duy nhất. Nếu có sự kết hợp giữa các tab và dấu cách, thì việc đảo chiều thụt lề có thể phức tạp. Cách dễ nhất để xử lý điều đó là thay thế tất cả các phiên bản của tab bằng số lượng khoảng trống thích hợp (thường là 4, mặc dù các ứng dụng riêng lẻ có thể khác nhau một cách hoang dại) trước khi chạy mã ở trên.
Cũng có thể sửa đổi mã ở trên để tăng thêm trọng số cho các tab. Tại thời điểm đó, regex không còn được sử dụng nhiều.
string[] l_lines = {
"\t\t\tpublic class MyClass",
" {",
" private bool MyMethod(string s)",
" {",
" \t \t\treturn s == \"\";",
" }",
"\t\t\t}"
};
int l_tabWeight = 8;
int l_smallestIndentation =
l_lines.Min
(
s => s.ToCharArray()
.TakeWhile(c => Char.IsWhiteSpace(c))
.Select(c => c == '\t' ? l_tabWeight : 1)
.Sum()
);
string[] l_result =
l_lines.Select
(
s =>
{
int l_whitespaceToRemove = l_smallestIndentation;
while (l_whitespaceToRemove > 0)
{
l_whitespaceToRemove -= s[0] == '\t' ? l_tabWeight : 1;
s = s.Substring(1);
}
return s;
}
).ToArray();
Prints (giả sử cửa sổ giao diện điều khiển của bạn có chiều rộng tab 8 như tôi):
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
Bạn có thể cần phải sửa đổi mã này để làm việc với cạnh trường hợp kịch bản, chẳng hạn như zero- các dòng hoặc đường dài chỉ chứa khoảng trắng.
Bạn có chắc chắn đó là tất cả không gian, và không phải tab nào? – Servy
Bạn không muốn 'UnindentAsMuchAsPossible' thành" return "' void', phải không? –
Bạn đúng @Tim. Đã sửa. – shamp00