2010-09-03 11 views
21

मेरे पास StringBuilder उदाहरण है जहां मैं उदाहरण के लिए कई sb.AppendLine("test"); कर रहा हूं।स्ट्रिंगबिल्डर लाइन गणना कैसे प्राप्त करें?

मैं कैसे काम करूं कि मेरे पास कितनी लाइनें हैं?

मुझे लगता है कि कक्षा में .Length है लेकिन यह मुझे बताता है कि सभी में कितने पात्र हैं।

कोई विचार?

+0

आप पंक्ति विराम की गिनती पर विचार किया है इस तरह? –

+0

गिनती लाइन ब्रेक के साथ केवल समस्या यह है कि स्ट्रिंगबिल्डर को तरीकों का पता/अनुक्रमणिका नहीं मिला है - आपको या तो चार्स अनुक्रमित संपत्ति का उपयोग करने या परिणामी स्ट्रिंग (ToString()) में गिनने की आवश्यकता है। यदि आप बार-बार लाइन गिनती की ज़रूरत है तो दोनों अक्षम हो सकते हैं। – VinayC

+1

जॉन, इसके लिए बहुत सारे स्पष्ट समाधान हैं; क्या आप यह बताने के लिए संदर्भ दे सकते हैं कि ये समाधान आपके लिए व्यवहार्य क्यों नहीं हैं? – tenfour

उत्तर

22

दक्षता के आधार पर छाँटे:

  1. अपने AppendLine() की गिनती
  2. एक पाश में indexOf() कॉलिंग कॉल
  3. Regex
  4. स्ट्रिंग का उपयोग करना। स्प्लिट()

अंतिम एक असाधारण महंगा है और कचरे के लॉट उत्पन्न करता है, इसका उपयोग न करें।

+7

मुझे लगता है कि विकल्प # 1 त्रुटियों का कारण बन सकता है, क्योंकि यह गारंटी नहीं देता है कि गिनती हुई ऐपेंडलाइन() कॉल वास्तव में न्यूलाइन की वास्तविक गणना से मेल खाती हैं। अन्य विकल्प प्रतिष्ठित समझ बनाते हैं। – code4life

+1

मेह, न्यूलाइन आकाश से नहीं गिरती है। लेकिन हां, दक्षता यहां रखरखाव को जोखिम दे रही है। –

+8

वे आकाश से नहीं गिर सकते हैं लेकिन वे 'पर्यावरण। न्यूलाइन', '\ r \ n',' \ n', या यहां तक ​​कि अन्य तरीकों से गुजरने वाली सामग्री से भी आ सकते हैं। –

2

आपको स्ट्रिंग में \ n की मौत की संख्या की खोज करने में सक्षम होना चाहिए।

अद्यतन:

sb.ToString().Split('\n').length; 
+0

निश्चित रूप से काम करेगा लेकिन एक अच्छा समाधान नहीं है यदि आपको बार-बार लाइन गिनती की आवश्यकता है। बेशक, जॉन ने उल्लेख नहीं किया है कि वह इसे एक बार या कई बार चाहता है। – VinayC

+0

@VninayC - हाँ, यह मेरे सिर के शीर्ष पर एक विचार था कि इसे कैसे किया जाए, मुझे इसे शुरुआत से पसंद नहीं आया क्योंकि आपको कुछ भी करने के लिए ToString() करना है। निश्चित रूप से यदि आप इसे कई बार ऐसा करना चाहते थे जो इसे गिनती रखता है तो वह सबसे अच्छा होगा। –

18

आप लपेट सकता है अपनी खुद की कक्षा के साथ StringBuilder कि की गणना होगी: एक तरह से नई पंक्ति चरित्र पर विभाजित है और सरणी में तत्वों की संख्या गिनती करने के लिए इस प्रकार हो सकता है लाइनों के रूप में जोड़े गए हैं या आपके निर्माता पूर्ण होने के बाद '\ n' की संख्या हो सकती है।

Regex.Matches(builder.ToString(), Environment.NewLine).Count 
+1

+1 अपनी कक्षा, या यहां तक ​​कि एक विस्तार विधि भी। – user7116

+4

मुझे लगता है कि आपका मतलब Regex.Matchches (builder.ToString(), Environment.NewLine)। गणना; क्योंकि मैच() केवल एक मैच देता है। – alex440

0

स्ट्रिंग में लाइन टर्मिनेटर (उदा: \ r \ n) की संख्या गिनने के लिए एक रेगेक्स करें। या, एक पाठ बॉक्स में तार लोड और एक लाइन गिनती है, लेकिन यह

4

करने का हैक-ey रास्ता thats इसे आज़माएं:

sb.ToString().Split(System.Environment.NewLine.ToCharArray()).Length; 
+2

उम्म ... यह कोड लाइनों को दोहराता है ... उदाहरण के लिए sb.AppendLine ("a") की 3 पंक्तियां; परिणाम 7, 3 नहीं होगा ...! – code4life

+0

@ code4life हां (निश्चित रूप से प्रश्न में सिस्टम पर 'न्यूलाइन' स्ट्रिंग की 'लंबाई' के आधार पर)। –

0

आप String [] सरणी में डेटा bulider स्ट्रिंग विभाजित कर सकते हैं और फिर स्ट्रिंग [] का उपयोग करें। लाइनों की संख्या के लिए लंबाई।

कुछ नीचे के रूप में की तरह:

String[] linestext = sb.Split(newline) 
Console.Writeline(linetext.Length) 
1

गिनती अपनी खुद की लाइन प्राप्त StringBuilder जहां AppendLine अप एक आंतरिक लाइन गिनती और लाइन गिनती का मूल्य पाने के लिए एक तरीका प्रदान करता है।

6

आप एक आवरण वर्ग बना सकते हैं निम्न कार्य करें:

public class Wrapper 
{ 
    private StringBuilder strBuild = null; 
    private int count = 0; 
    public Wrapper(){ 
     strBuild = new StringBuilder(); 
    } 
    public void AppendLine(String toAppendParam){ 
     strBuild.AppendLine(toAppendParam); 
     count++; 
    } 
    public StringBuilder getStringBuilder(){ 
     return strBuild; 
    } 

    public int getCount(){ 
     return count; 
    } 
} 
+3

अपना कोड स्वरूपण फिक्स्ड, लेकिन आप जावा के बजाए सी # के लिए अधिक मूर्खतापूर्ण होने के लिए इसे बदलना चाहते हैं। – user7116

2

अद्यतनWhat Gabe said

b.ToString()। गणना (ग => ग == '\ N') यहाँ भी काम करेगा, और न बनाने के अलावा बहुत कम कुशल हो सकता है ( स्ट्रिंग की एक अलग प्रति!)।


एक बेहतर तरीका, StringBuilder से एक स्ट्रिंग और यह बंटवारे बनाने (या स्ट्रिंग बनाने और regex यह ing) की तुलना में तेजी, StringBuilder पर गौर और वहाँ '\n' पात्रों की संख्या की गणना करने के लिए है में

निम्न एक्सटेंशन विधि स्ट्रिंग बिल्डर में वर्णों के माध्यम से गणना करेगी, तब आप उस पर लिनक कर सकते हैं जब तक कि आपके दिल की सामग्री न हो।

public static IEnumerable<char> GetEnumerator(this StringBuilder sb) 
    { 
     for (int i = 0; i < sb.Length; i++) 
      yield return sb[i]; 
    } 

... यहां इस्तेमाल किया, गिनती हो जाएगा 4

 StringBuilder b = new StringBuilder(); 
     b.AppendLine("Hello\n"); 
     b.AppendLine("World\n"); 

     int lineCount = b.GetEnumerator().Count(c => c =='\n'); 

+0

'b.ToString()। गणना (सी => सी == '\ n') 'यहां भी काम करेगी, और शायद कम कुशल नहीं हो सकती है (स्ट्रिंग की एक अलग प्रति बनाने से अलग!)। – Gabe

+0

@Gabe: मुझे 'b.ToString() जाना चाहिए था। गणना (c => c ==' \ n ')' मेरे गणक के समय लगभग 2/3 लेता है। –

2

आप String.Split() का उपयोग करने जा रहे हैं, आप के साथ स्ट्रिंग को विभाजित करने की आवश्यकता होगी कुछ विकल्प

static void Main(string[] args) 
{ 
    var sb = new StringBuilder(); 
    sb.AppendLine("this"); 
    sb.AppendLine("is"); 
    sb.AppendLine("a"); 
    sb.AppendLine("test"); 

    // StringSplitOptions.None counts the last (blank) newline 
    // which the last AppendLine call creates 
    // if you don't want this, then replace with 
    // StringSplitOptions.RemoveEmptyEntries 
    var lines = sb.ToString().Split(
     new string[] { 
      System.Environment.NewLine }, 
     StringSplitOptions.None).Length; 

    Console.WriteLine("Number of lines: " + lines); 

    Console.WriteLine("Press enter to exit."); 
    Console.ReadLine(); 
} 

इस में जो परिणाम:

Number of lines: 5

संबंधित मुद्दे