एक छोटे से LINQ और regex का उपयोग कम से कम खरोज लगता है, फिर सभी पंक्तियों से वर्णों की संख्या हटा दें।
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);
प्रिंटों:
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
इस कार्यक्रम सरणी में सभी स्ट्रिंग्स को स्कैन करेगा। आप यह मान सकते हैं कि पहली पंक्ति से कम दांतेदार है, तो आप केवल पहली पंक्ति को स्कैन करके प्रदर्शन में सुधार कर सकते हैं:
int l_smallestIndentation =
Regex.Match(l_lines[0], "^\\s*").Value.Length;
यह भी ध्यान रखें कि यह एक एकल चरित्र के रूप में एक टैब वर्ण ("\t"
) को संभाल लेंगे। यदि टैब और रिक्त स्थान का मिश्रण होता है, तो इंडेंट को उलटना मुश्किल हो सकता है। इसे संभालने का सबसे आसान तरीका रिक्त स्थान की उचित संख्या के साथ टैब के सभी उदाहरणों को प्रतिस्थापित करना होगा (अक्सर 4, हालांकि व्यक्तिगत अनुप्रयोग जंगली रूप से भिन्न हो सकते हैं) ऊपर दिए गए कोड को चलाने से पहले।
टैब पर अतिरिक्त वजन देने के लिए ऊपर दिए गए कोड को संशोधित करना भी संभव होगा। उस बिंदु पर, रेगेक्स अब अधिक उपयोग नहीं है।
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
आप किनारे मामले के परिदृश्यों के साथ काम करने के लिए इस कोड को संशोधित करने की आवश्यकता हो सकती है, जैसे शून्य:
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();
प्रिंटों (अपने कंसोल विंडो संभालने मेरे जैसे एक टैब 8 की चौड़ाई है) लंबाई रेखाएं या रेखाएं जिनमें केवल सफेद जगहें होती हैं।
आप यकीन है कि यह सभी रिक्त स्थान है कर रहे हैं शामिल है, और कोई टैब नहीं? – Servy
आप 'UnindentAsMuchAs संभावित' को 'शून्य' वापस करने के लिए नहीं चाहते हैं, है ना? –
आप सही @Tim हैं। फिक्स्ड। – shamp00