C #: Vòng qua các dòng của chuỗi nhiều dòng


100

Cách tốt để lặp qua từng dòng của một chuỗi nhiều dòng mà không cần sử dụng thêm nhiều bộ nhớ (ví dụ như không chia nó thành một mảng) là gì?

Câu trả lời:


158

Tôi đề nghị sử dụng kết hợp StringReaderLineReaderlớp của tôi , là một phần của MiscUtil nhưng cũng có sẵn trong câu trả lời StackOverflow này - bạn có thể dễ dàng sao chép chỉ lớp đó vào dự án tiện ích của riêng mình. Bạn sẽ sử dụng nó như thế này:

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

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

Looping trên tất cả các dòng trong một cơ thể của dữ liệu chuỗi (cho dù đó là một tập tin hoặc bất cứ điều gì) là rất phổ biến mà nó không nên yêu cầu mã gọi hàm được thử nghiệm for null vv :) Có nói rằng, nếu bạn làm muốn làm một vòng lặp thủ công, đây là hình thức mà tôi thường thích hơn Fredrik's:

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

Bằng cách này, bạn chỉ phải kiểm tra tính vô hiệu một lần và bạn cũng không phải nghĩ về vòng lặp do / while (vì lý do nào đó tôi luôn mất nhiều công sức để đọc hơn vòng lặp while thẳng).


74

Bạn có thể sử dụng một StringReaderđể đọc một dòng tại một thời điểm:

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
Tuyệt quá; +1; điều này đã giúp; nhưng tôi chỉ muốn thêm rằng người ta không thực sự cần sử dụng khối "using" vì không có bất kỳ tài nguyên nào để đóng trong trường hợp này. Xem nhận xét trong bài viết StringReader tại docs.microsoft.com
RD Alkire

10

Tôi biết điều này đã được trả lời, nhưng tôi muốn thêm câu trả lời của riêng mình:

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

7

từ MSDN cho StringReader

    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

Đây là đoạn mã nhanh sẽ tìm thấy dòng không trống đầu tiên trong một chuỗi:

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

Để cập nhật câu hỏi cổ xưa này cho .NET 4, bây giờ có một cách gọn gàng hơn nhiều:

var lines = File.ReadAllLines(filename);

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

0

Hãy thử sử dụng Phương pháp String.Split:

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

foreach (string line in text.Split('\n'))
{
    // do something
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.