Verwenden Sie ein wenig LINQ und Regex die kürzeste Vertiefung zu finden, Entfernen Sie dann die Anzahl der Zeichen aus allen Zeilen.
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);
Drucke:
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
Dieses Programm wird alle Strings im Array scannen. Wenn Sie davon ausgehen können, dass die erste Zeile des am wenigsten eingerückt ist, dann könnte man die Leistung verbessern durch das Scannen nur die erste Zeile:
int l_smallestIndentation =
Regex.Match(l_lines[0], "^\\s*").Value.Length;
Beachten Sie auch, dass dies ein Tab-Zeichen behandelt ("\t"
) als ein einzelnes Zeichen. Wenn es eine Mischung aus Tabulatoren und Leerzeichen gibt, kann es schwierig sein, den Einzug umzukehren. Der einfachste Weg, dies zu handhaben, wäre, alle Instanzen von Tabs mit der entsprechenden Anzahl von Leerzeichen (oft 4, obwohl einzelne Anwendungen können wild variieren) zu ersetzen vor mit dem Code oben.
Es wäre auch möglich, den obigen Code zu ändern, um den Registerkarten zusätzliches Gewicht zu verleihen. An diesem Punkt ist die Regex nicht mehr von großem Nutzen.
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();
Drucke (Ihr Konsolenfenster unter der Annahme, eine Lasche Breite von 8 wie bei mir):
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
Möglicherweise müssen Sie diesen Code ändern mit kanten Case-Szenarien zu arbeiten, wie null- Längenlinien oder Linien, die nur Leerzeichen enthalten.
Sind enthält, und keine Tabs? – Servy
Sie möchten nicht, dass "UnindentAsMuchAsPossible" "void" zurückgibt, oder? –
Sie haben Recht @Tim. Fest. – shamp00