2012-12-27 23 views
6

के साथ समाप्त होता है, मेरे पास StringBuilder है जो कोड जमा करता है। कुछ मामलों में, इसमें कोड ब्लॉक के बीच 2 खाली रेखाएं हैं, और मैं इसे 1 खाली रेखा बनाना चाहता हूं।
मैं कैसे जांच सकता हूं कि वर्तमान कोड में अंत में खाली रेखा है या नहीं? (मैं प्रदर्शन के मुद्दों की वजह से इसकी ToString() विधि का उपयोग करने के लिए नहीं पसंद करते हैं।)सी # स्ट्रिंगबिल्डर: जांचें कि क्या यह एक नई लाइन

+0

आपको या तो उन्हें जोड़ने के रूप में लाइनों/ब्लॉक को जांचना होगा - या सभी "डबल नई लाइनों" को एक के साथ प्रतिस्थापित करना होगा, और अंत को ट्रिम करें। –

+1

दो पर्यावरण की किसी भी घटना को प्रतिस्थापित और प्रतिस्थापित करने का उपयोग कर सकता है। एक पर्यावरण के साथ न्यूलाइन। न्यूलाइन (यह इमारत के अंत में)। एक और संभावना अंतिम चरित्र प्राप्त करने के लिए ToString (लंबाई -11) है। –

+0

यही वह है जो मैंने अंततः किया था। इसे उत्तर के रूप में पोस्ट किया गया था लेकिन हटा दिया गया था क्योंकि किसी ने उल्लेख किया था कि यह कोड के बीच में डबल नई लाइनों को भी हटा देगा। यह वास्तव में मेरे लिए कोई फर्क नहीं पड़ता, इसलिए यदि यह समाधान उत्तर के रूप में पोस्ट किया जाएगा, तो मैं इसे चिह्नित करूंगा। – Noich

उत्तर

-1

जब से मैं कोड के बीच में लगभग 2 खाली लाइनों परवाह नहीं है, सबसे आसान तरीका

myCode.Replace(string.Format("{0}{0}", Environment.NewLine),Environment.NewLine); 

इस विकल्प का उपयोग करने का उपयोग करने वाले वर्गों में कोई भी परिवर्तन की आवश्यकता नहीं है है कोड संचयक।

+0

यह काम नहीं करेगा यदि 'myCode'' पर्यावरण.NewLine' का उपयोग इसके लाइन विभाजक के रूप में नहीं करता है। साथ ही, यह अधिक कुशल नहीं है कि 'ToString'। –

6

आप की तरह आप एक String के साथ होता है, अपने सूचकांक के साथ अपने StringBuilder के किसी भी चरित्र पहुँच सकते हैं।

var sb = new StringBuilder(); 
sb.Append("Hello world!\n"); 
Console.WriteLine(sb[sb.Length - 1] == '\n'); // True 
+0

मैं विशाल कोड भाग के बारे में बात कर रहा हूं। मैंने परिष्करण पात्रों की जांच करने की कोशिश की लेकिन यह गन्दा हो गया। – Noich

0

कुछ मामलों में, यह कोड ब्लॉकों के बीच 2 खाली लाइनों है, और मैं करना चाहते हैं कि 1 खाली पंक्ति [...] मैं की वजह से इसकी ToString() विधि का उपयोग नहीं करना प्रदर्शन के कारण।

सबसे पहले आपको खुद से पूछना चाहिए कि न्यूलाइन क्यों हैं। ToString() बुला बिना,

void AddToStringBuilder(string input) 
{ 
    input = input.TrimStart('\r', '\n'); 
    input = input.TrimEnd('\r', '\n'); 

    _stringBuilder.AppendLine(input); 
} 

या यदि आप पूर्व में जोड़े भाग को देखने के लिए चाहते हैं: जबकि पाठ जोड़ने आप इनपुट को नियंत्रित कर सकते हैं, तो आप आसानी से परिभाषित कर सकते हैं प्रवेश करती है कि कितने में प्रवेश पाने के

string _previousInput = null; 

void AddToStringBuilder(string input) 
{ 
    if (!String.IsNullOrEmpty(_previousInput) 
     && _previousInput.EnsWith('\n')) 
    { 
     _stringBuilder.Append(input); 
    } 
    else 
    { 
     _stringBuilder.AppendLine(input); 
    } 

    _previousInput = input;  
} 
2

आप नई-पंक्तियों को सामान्य कर सकते हैं, एक regex का उपयोग कर:

var test = @"hello 

moop 

hello"; 

var regex = new Regex(@"(?:\r\n|[\r\n])+"); 

var newLinesNormalized = regex.Replace(test, Environment.NewLine); 

उत्पादन:

hello 
moop 
hello 
+1

यह 'स्ट्रिंगबिल्डर' से कैसे संबंधित है? –

1

यहां पूरा उदाहरण है।

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"); 

    }    
} 
+0

इसके लिए मेरे कोड में एक बड़ा बदलाव की आवश्यकता होगी - मैं परिवर्तनों को न्यूनतम रखना चाहता हूं। यद्यपि कोड नमूना के लिए धन्यवाद। – Noich

0

मामले में कोई भी यहां समाप्त होता है जैसा कि मैंने यहां किया है StringBuilder के अंत में ToString का उपयोग करने के साथ मनमाने ढंग से स्ट्रिंग के लिए एक सामान्य विधि है।

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; 
} 
2

सिंगल लाइन चेक। स्ट्रिंगबिल्डर नहीं, एक स्ट्रिंग प्रकार का उपयोग करता है, लेकिन आपको मूल विचार प्राप्त करना चाहिए।

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 
}