Просто сделал для моего любопытства.
var originalList = new List<string>
{
"1235 \t This is Record 1",
"7897 \t This is Record 2",
"8977 \t This is Record 3",
"continued on the next line",
"and still continued more",
"8375 \t This is Record 4"
};
var resultList = new List<string>();
resultList.Add(originalList.Aggregate((workingSentence, next)
=> {
if (next.Contains("\t"))
{
resultList.Add(workingSentence);
return next;
}
else
{
workingSentence += "|" + next;
return workingSentence;
}
}));
Список результатов должен содержать то, что вы хотите.
Обратите внимание, что это не оптимальное решение. Строка workingSentence += "|" + next;
может создавать множество временных объектов в зависимости от вашего шаблона данных.
Оптимальное решение может заключаться в том, чтобы хранить несколько индексных переменных для просмотра впереди строк и объединять их, когда следующая строка содержит символ табуляции, а не объединять один за другим, как показано выше. Однако он будет более сложным, чем приведенный выше, из-за проверки границ и хранения нескольких индексных переменных :).
Обновление : следующее решение не будет создавать временные строковые объекты для объединения.
var resultList = new List<string>();
var tempList = new List<string>();
tempList.Add(originalList.Aggregate((cur, next)
=> {
tempList.Add(cur);
if (next.Contains("\t"))
{
resultList.Add(string.Join("|", tempList));
tempList.Clear();
}
return next;
}));
resultList.Add(string.Join("|", tempList));
Ниже приведено решение с использованием цикла for
.
var resultList = new List<string>();
var temp = new List<string>();
for(int i = 0, j = 1; j < originalList.Count; i++, j++)
{
temp.Add(originalList[i]);
if (j != originalList.Count - 1)
{
if (originalList[j].Contains("\t"))
{
resultList.Add(string.Join("|", temp));
temp.Clear();
}
}
else // when originalList[j] is the last item
{
if (originalList[j].Contains("\t"))
{
resultList.Add(string.Join("|", temp));
resultList.Add(originalList[j]);
}
else
{
temp.Add(originalList[j]);
resultList.Add(string.Join("|", temp));
}
}
}