C #: मल्टीलाइन स्ट्रिंग की लाइनों के माध्यम से लूपिंग


100

बहुत अधिक मेमोरी (उदाहरण के लिए इसे किसी ऐरे में विभाजित किए बिना) का उपयोग किए बिना मल्टीलाइन स्ट्रिंग की प्रत्येक पंक्ति के माध्यम से लूप करने का एक अच्छा तरीका क्या है?

जवाबों:


158

मेरा सुझाव है कि मैं StringReaderऔर मेरी LineReaderकक्षा के संयोजन का उपयोग करें , जो कि MiscUtil का हिस्सा है, लेकिन इस StackOverflow के उत्तर में भी उपलब्ध है - आप आसानी से उस वर्ग को अपनी उपयोगिता परियोजना में कॉपी कर सकते हैं। आप इसे इस तरह उपयोग करेंगे:

string text = @"First line
second line
third line";

foreach (string line in new LineReader(() => new StringReader(text)))
{
    Console.WriteLine(line);
}

स्ट्रिंग डेटा के एक निकाय (चाहे वह फ़ाइल या जो भी हो) में सभी रेखाओं पर लूपिंग इतनी आम है कि इसे कॉलिंग कोड को नल आदि के लिए परीक्षण करने की आवश्यकता नहीं होनी चाहिए :) ने कहा कि, यदि आप एक करना चाहते हैं मैनुअल लूप, यह वह रूप है जिसे मैं आमतौर पर फ्रेड्रिक के ऊपर पसंद करता हूं:

using (StringReader reader = new StringReader(input))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // Do something with the line
    }
}

इस तरह से आपको केवल एक बार अशक्तता के लिए परीक्षण करना होगा, और आपको लूप के बारे में सोचना नहीं है / (जबकि किसी कारण से हमेशा मुझे लूप करते हुए पढ़ने की तुलना में अधिक प्रयास करना पड़ता है)।


74

आप StringReaderएक समय में एक पंक्ति पढ़ने के लिए उपयोग कर सकते हैं :

using (StringReader reader = new StringReader(input))
{
    string line = string.Empty;
    do
    {
        line = reader.ReadLine();
        if (line != null)
        {
            // do something with the line
        }

    } while (line != null);
}

1
महान; +1; इससे मदद मिली; लेकिन मैं सिर्फ यह जोड़ना चाहता हूं कि वास्तव में "ब्लॉक" का उपयोग करने की आवश्यकता नहीं है क्योंकि इस मामले में बंद करने के लिए कोई संसाधन नहीं हैं। StringReader लेख में docs.microsoft.com पर टिप्पणी
RD Alkire

10

मुझे पता है कि यह उत्तर दिया गया है, लेकिन मैं अपना स्वयं का उत्तर जोड़ना चाहूंगा:

using (var reader = new StringReader(multiLineString))
{
    for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
    {
        // Do something with the line
    }
}

7

स्ट्रिंग के लिए MSDN से

    string textReaderText = "TextReader is the abstract base " +
        "class of StreamReader and StringReader, which read " +
        "characters from streams and strings, respectively.\n\n" +

        "Create an instance of TextReader to open a text file " +
        "for reading a specified range of characters, or to " +
        "create a reader based on an existing stream.\n\n" +

        "You can also use an instance of TextReader to read " +
        "text from a custom backing store using the same " +
        "APIs you would use for a string or a stream.\n\n";

    Console.WriteLine("Original text:\n\n{0}", textReaderText);

    // From textReaderText, create a continuous paragraph 
    // with two spaces between each sentence.
    string aLine, aParagraph = null;
    StringReader strReader = new StringReader(textReaderText);
    while(true)
    {
        aLine = strReader.ReadLine();
        if(aLine != null)
        {
            aParagraph = aParagraph + aLine + " ";
        }
        else
        {
            aParagraph = aParagraph + "\n";
            break;
        }
    }
    Console.WriteLine("Modified text:\n\n{0}", aParagraph);

2

यहां एक त्वरित कोड स्निपेट दिया गया है जो एक स्ट्रिंग में पहली गैर-खाली लाइन ढूंढेगा:

string line1;
while (
    ((line1 = sr.ReadLine()) != null) &&
    ((line1 = line1.Trim()).Length == 0)
)
{ /* Do nothing - just trying to find first non-empty line*/ }

if(line1 == null){ /* Error - no non-empty lines in string */ }

2

.NET 4 के लिए इस प्राचीन प्रश्न को अपडेट करने के लिए, अब एक बहुत अधिक रास्ता है:

var lines = File.ReadAllLines(filename);

foreach (string line in lines)
{
    Console.WriteLine(line);
}

0

String.Split विधि का उपयोग करने का प्रयास करें:

string text = @"First line
second line
third line";

foreach (string line in text.Split('\n'))
{
    // do something
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.