LINQ to XML - действительно путь здесь:
var textArray = topElement.Elements("L")
.Select(x => x.Value)
.ToArray();
var text = string.Join(" ", textArray);
РЕДАКТИРОВАТЬ: Судя по комментарию, похоже, вам просто нужен способ выражения этого с одним выражением. Это легко, хотя и несколько уродливо:
result = (from indexentry in source.Elements(entryLevel)
select new IndexEntry
{
EtiologyCode = indexentry.Element("IE") == null
? null
: indexentry.Element("IE").Value,
//some code to set other properties in this object
Note = string.Join(" ", indexentry.Elements("NO")
.Descendants()
.Select(x => x.Value)
.ToArray())
};
Другой альтернативой является извлечение его в отдельный метод расширения (он должен быть в статическом классе верхнего уровня):
public static string ConcatenateTextNodes(
this IEnumerable<XElement> elements)
{
string[] values = elements.Select(x => x.Value).ToArray();
// You could parameterise the delimiter here if you wanted
return string.Join(" ", values);
}
затем измените свой код на:
result = (from indexentry in source.Elements(entryLevel)
select new IndexEntry
{
EtiologyCode = indexentry.Element("IE") == null
? null
: indexentry.Element("IE").Value,
//some code to set other properties in this object
Note = indexentry.Elements("NO")
.Descendants()
.ConcatenateTextNodes()
}
РЕДАКТИРОВАТЬ: примечание об эффективности
Другие ответы предлагают использовать StringBuilder
во имя эффективности. Я бы проверил доказательства того, что это правильный путь, прежде чем использовать его. Если вы подумаете об этом, StringBuilder
и ToArray
делают схожие вещи - они создают буфер больше, чем нужно, добавляют к нему данные, изменяют его размер при необходимости и в конце получают результат. Надеюсь, вам не нужно будет слишком часто менять размер.
Разница между StringBuilder
и ToArray
- вот что буферизуется - в StringBuilder
это все содержимое строки, которую вы создали до сих пор. С ToArray
это просто ссылок. Другими словами, изменение размера внутреннего буфера, используемого для ToArray
, вероятно, будет дешевле, чем изменение размера для StringBuilder
, , особенно , если отдельные строки длинные.
После выполнения буферизации в ToArray
, string.Join
чрезвычайно эффективен: он может просматривать все строки, с которых нужно начинать, точно сколько места выделяется и затем объединить его без необходимости копировать фактические символьные данные.
Это резкий контраст с предыдущим ответом, который я дал - но, к сожалению, я не думаю, что когда-либо писал эталонный тест.
Я, конечно, не ожидал бы, что ToArray
будет значительно медленнее, и я думаю, что это делает код проще здесь - не нужно использовать побочные эффекты и т. Д., Агрегирование и т. Д.