C# объединение строк из файла

453
27 февраля 2018, 02:45

Имеется txt файл вида:

Джон Добрый день! 
Секретарь Здравствуйте! Вы по какому вопросу?
Джон Извините, я хотел бы сдать сессию пораньше, чтобы уехать домой.  
Секретарь По какой причине Вы хотите досрочно сдать сессию?

Нужно объединить 1 + 2 Результат:

Джон Добрый день!
Секретарь Здравствуйте! Вы по какому вопросу?

Потом 3 + 4

Джон Извините, я хотел бы сдать сессию пораньше, чтобы уехать домой.
Секретарь По какой причине Вы хотите досрочно сдать сессию?

И так до конца файла

Считываю файл так

        FileStream stream = new FileStream(path, FileMode.Open);
        StreamReader reader = new StreamReader(stream);
        string str = reader.ReadLine();
        stream.Close();

        Console.WriteLine(str);

Но дальше не знаю,что делать

Answer 1

С помощью библиотеки morelinq это можно сделать так:

var stringsPairs = File.ReadLines(...).Batch(2).Select(p => string.Join("\n", p));
Answer 2

Зачем читать по чуть-чуть, если можно одной строкой обойтись:

var text = File.ReadAllLines(@"C:\downloads\asdf123.txt");

Или прочитать их же лениво, но по-прежнему одной строкой:

var text = File.ReadLines(@"C:\downloads\asdf123.txt");

Получим массив строк (ReadAllLines) или IEnumerable<string> (ReadLines):

И после этого соединить строки:

var result = string.Join(" ", text);

Разделитель по вкусу - хоть пробел, хоть перевод строки.

Если же у вас нужно по две объединить (посмотрел разметку вопроса, но не уверен, что правильно понял), то:

public IEnumerable<string> Twix(IEnumerable<string> data)
{
    var e = data.GetEnumerator();
    while (e.MoveNext())
    {
        var el1 = e.Current;
        if(e.MoveNext())
        {
            var el2 = e.Current;
            yield return $"{el1} {el2}";
        }
        else
        {
            yield return el1;
        }
    }
}

Запускаем:

var result = Twix(text);

На выходе:

И на закуску linq-однострочник (если будет нечётное число строк, то последняя не попадёт в результат):

var result = text.Where((a,i) => i % 2 == 0).Zip(text.Where((a,i) => i % 2 == 1), (a,b) => $"{a} {b}");
READ ALSO
Unity(C#) — Почему не работают корутины?

Unity(C#) — Почему не работают корутины?

Недавно начал изучать корутиныНе совсем понимаю, как они работают

214
Верстка DataGrid В XAML

Верстка DataGrid В XAML

Как реализовать таблицу такого вида на XAML? Туплю конкретноЕсли не сложно, можно готовый код или ссылку на статью, где подобное подробно описывается

211
Сокеты, выход за границы массива?

Сокеты, выход за границы массива?

Люди добрые, осваиваю сокеты на c#, и увидел товарища на ютюбе, который объясняет как это делатьВообщем, когда он принимает сообщение от клиента(простая...

144