użyć trochę LINQ i regex znaleźć najkrótszą wcięcia, następnie usuń tę liczbę znaków ze wszystkich linii.
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);
Wydruki:
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
Program ten skanuje wszystkie sznurki w tablicy. Jeśli można założyć, że pierwsza linia jest najmniej wcięty, a następnie można zwiększyć wydajność poprzez skanowanie tylko pierwszy wiersz:
int l_smallestIndentation =
Regex.Match(l_lines[0], "^\\s*").Value.Length;
Należy również pamiętać, że to będzie obsługiwać znak tabulatora ("\t"
) jako pojedynczego znaku. Jeśli występuje mieszanka zakładek i spacji, cofnięcie wcięcia może być trudne. Najprostszym sposobem na obsłużenie tego byłoby zastąpienie wszystkich instancji kart z odpowiednią liczbą spacji (często 4, chociaż poszczególne aplikacje mogą się znacznie różnić) przed uruchomieniem powyższego kodu.
Byłoby również możliwe zmodyfikowanie powyższego kodu w celu nadania dodatkowej wagi zakładkom. W tym momencie wyrażenie regularne nie jest już zbyt użyteczne.
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();
nadrukami (zakładając swoją konsolę ma szerokość zakładki z 8 jak ja):
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
może trzeba zmodyfikować ten kod do pracy ze scenariuszami krawędzi sprawy, takich jak zero- linie długości lub linie zawierające tylko białe spacje.
Czy jesteś pewien, że wszystkie przestrzenie, i nie ma żadnych zakładek? – Servy
Nie chcesz, aby 'UnindentAsMuchAsPossible' mógł" zwracać "' void', prawda? –
Masz rację @Tim. Naprawiony. – shamp00