2010-05-27 15 views
5

मेरे पास 3 टेक्स्ट रीडर हैं - StreamReaders और स्ट्रिंग रीडर का संयोजन। संकल्पनात्मक रूप से, उनमें से एक संयोजन एक पाठ दस्तावेज़ है।एकाधिक टेक्स्ट रीडर को एक साथ कैसे स्ट्रिंग करें?

मैं एक विधि (मेरे नियंत्रण में नहीं) को कॉल करना चाहता हूं जो एक पाठ पाठक लेता है। क्या एकाधिक टेक्स्ट रीडर से एक समेकित टेक्स्ट रीडर बनाने का कोई अंतर्निहित या आसान तरीका है?

(मैं सकता है मेरे अपने TextReader उपवर्ग बारे में है, लेकिन यह काम भी पर्याप्त मात्रा में की तरह दिखता है। उस मामले में, मैं सिर्फ उन्हें सब बाहर एक अस्थायी फ़ाइल पर लिखने और फिर एक StreamReader के साथ इसे खोलने चाहते हैं।)

क्या इसका कोई आसान समाधान है कि मुझे याद आ रही है?

उत्तर

5

मैंने इसे एक साथ फेंक दिया, इसलिए यह सुपर-मजबूत नहीं है (कोई त्रुटि प्रबंधन नहीं है) लेकिन मूल परीक्षण केस काम करता है।

यह TextReader की जो एक दूसरे लेने के लिए एक विस्तार विधि बनाकर काम करता है, और एक नया TextReader वर्ग जो आंतरिक रूप से पहले पर Read() कॉल जब तक यह खत्म हो देता है, और फिर दूसरी पर Read() बुला शुरू होता है। आप इसे अनिश्चित काल तक श्रृंखलाबद्ध कर सकते हैं।

TextReader की एक पूरी कार्यान्वयन आप केवल Read(), Peek(), Close() और Dispose() लागू करने की आवश्यकता प्रदान करना। अन्य सभी विधियां काम करने के लिए विशिष्ट कार्यान्वयन Read() पर भरोसा करती हैं। तो अपना खुद का TextReader बनाना वास्तव में इतना बुरा नहीं है, जैसा कि आप नीचे देख सकते हैं।

यह किसी भी प्रदर्शन चिंताओं को भी कम करता है क्योंकि हम केवल मौजूदा टेक्स्ट रीडर को लपेट रहे हैं और वास्तव में उन्हें concatenation करने के लिए आमंत्रित नहीं कर रहे हैं।

class Program 
{ 
    static void Main(string[] args) 
    { 
     StringReader first = new StringReader("hello "); 
     StringReader second = new StringReader("world"); 
     StringReader third = new StringReader("!"); 

     using (var allOfThem = first.Concat(second).Concat(third)) 
     { 
      //writes "hello world!" 
      Console.WriteLine(allOfThem.ReadToEnd()); 
     } 
     Console.Read(); 
    } 
} 

public static class Extensions 
{ 
    public static TextReader Concat(this TextReader first, TextReader second) 
    { 
     return new ChainedTextReader(first, second); 
    } 

    private class ChainedTextReader : TextReader 
    { 
     private TextReader first; 
     private TextReader second; 
     private bool readFirst = true; 

     public ChainedTextReader(TextReader first, TextReader second) 
     { 
      this.first = first; 
      this.second = second; 
     } 

     public override int Peek() 
     { 
      if (readFirst) 
      { 
       return first.Peek(); 
      } 
      else 
      { 
       return second.Peek(); 
      } 
     } 

     public override int Read() 
     { 
      if (readFirst) 
      { 
       int value = first.Read(); 
       if (value == -1) 
       { 
        readFirst = false; 
       } 
       else 
       { 
        return value; 
       } 
      } 
      return second.Read(); 
     } 

     public override void Close() 
     { 
      first.Close(); 
      second.Close(); 
     } 

     protected override void Dispose(bool disposing) 
     { 
      base.Dispose(disposing); 
      if (disposing) 
      { 
       first.Dispose(); 
       second.Dispose(); 
      } 
     } 
    } 
} 
+1

ओह, यह चालाक है: केवल 2 को संभालें, और उन्हें श्रृंखलाबद्ध करने के लिए एक एक्सटेंशन विधि का उपयोग करें। – Ken

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