Лучший способ получить InnerXml XElement?

Вы очень близки, вы должны просто использовать форму let вместо def здесь:

(defn create-contest
  "Creates a monty hall doors contest"
  [n]
  (let [door-with-car (rand-int n)] ;; let instead of def
    (map
      (fn [i] (if (= i door-with-car) :car :closed))
      (range n))))

def свяжет некоторое значение с переменной в текущем пространстве имен, но Вы хотите связать значение в области действия этой функции, и для этого хорошо let. См. этот Q & A для другого объяснения.

(defn create-doors
  "Create a collection of monty hall contests"
  [doors contests]
  (map
    create-contest ;; no need to wrap create-contest in another function here
    (repeat contests doors)))

Вам не нужно заключать create-contest в другую функцию для использования с map - вы можете просто передать функцию непосредственно в map в качестве значения. doall необходим только для принудительной реализации отложенной последовательности из map, поэтому вам, вероятно, не нужно / не нужно этого внутри create-doors.

(create-doors 4 10)
=>
((:closed :closed :car :closed)
 (:closed :closed :closed :car)
 (:closed :car :closed :closed)
 (:closed :closed :closed :car)
 (:closed :car :closed :closed)
 (:closed :car :closed :closed)
 (:closed :car :closed :closed)
 (:closed :closed :closed :car)
 (:closed :closed :car :closed)
 (:closed :closed :car :closed))

144
задан 30.05.2015, 11:04

6 ответов

Удивление, если (замечают, что я избавился от b + = и просто имею b +)

t.Element( "body" ).Nodes()
 .Aggregate( "", ( b, node ) => b + node.ToString() );

могло бы быть немного менее эффективным, чем

string.Join( "", t.Element.Nodes()
                  .Select( n => n.ToString() ).ToArray() );

Не 100%, уверенных..., но глядящий на Агрегат () и строка. Соединение () в Отражателе... Я думаю , я считал его как Агрегат, просто добавляющий значение возврата, поэтому по существу Вы добираетесь:

строка = представляют в виде строки + строка

по сравнению со строкой. Соединение, это имеет некоторое упоминание там о FastStringAllocation или чем-то, которое делает меня вещью, люди в Microsoft, возможно, поместили некоторое дополнительное повышение производительности там. Конечно, мои.ToArray () называют мой инвертировать это, но я просто хотел предложить другое предложение.

0
ответ дан 05.10.2019, 12:17
  • 1
    У меня был он то же и да, прием должен запустить VS как Администратора. Спасибо за совместное использование Вы сохранили меня много времени! – Jean-François 31.08.2013, 20:19

Действительно ли возможно использовать объекты пространства имен System.Xml сделать задание здесь вместо того, чтобы использовать LINQ? Поскольку Вы уже упомянули, XmlNode. InnerXml точно, в чем Вы нуждаетесь.

0
ответ дан 05.10.2019, 12:17
  • 1
    Да, I' m думающий о преобразовании моего класса к структуре, которую я тогда или встраиваю в другой класс или происхожу из. – SmacL 11.06.2010, 12:31

Я закончил тем, что использовал это:

Body = t.Element("body").Nodes().Aggregate("", (b, node) => b += node.ToString());
7
ответ дан 05.10.2019, 12:17
  • 1
    Это сделает большую конкатенацию строк - I' d предпочитают Vin' s использование StringBuilder самостоятельно. Руководство foreach не является отрицанием. – Marc Gravell♦ 07.12.2008, 00:33
  • 2
    Если TR1 доступен, он может использовать станд.:: tr1:: has_trivial_copy и т.д. – Derek Ledbetter 12.06.2010, 05:30

Как насчет того, чтобы использовать этот "дополнительный" метод на XElement? работавший для меня!

public static string InnerXml(this XElement element)
{
    StringBuilder innerXml = new StringBuilder();

    foreach (XNode node in element.Nodes())
    {
        // append node's xml string to innerXml
        innerXml.Append(node.ToString());
    }

    return innerXml.ToString();
}

ИЛИ использование определенное примечание Linq

public static string InnerXml(this XElement element)
{
    StringBuilder innerXml = new StringBuilder();
    doc.Nodes().ToList().ForEach( node => innerXml.Append(node.ToString()));

    return innerXml.ToString();
}

: код выше должен использовать element.Nodes() в противоположность element.Elements(). Очень важная вещь помнить различие между двумя. element.Nodes() дает Вам все как XText, XAttribute и т.д., но XElement только Элемент.

18
ответ дан 05.10.2019, 12:17
  • 1
    @Neil, I' m знающий об этом. I' ve отредактировал мой ответ так для удаления возможного неправильного чтения. – Kirill V. Lyadvinsky 11.06.2010, 13:48

Я думаю, что это - намного лучший метод (в VB, не должно быть твердо перевести):

, Учитывая XElement x:

Dim xReader = x.CreateReader
xReader.MoveToContent
xReader.ReadInnerXml
69
ответ дан 05.10.2019, 12:17
  • 1
    Хороший! Это намного быстрее, чем некоторые из других предложенных методов (я протестировал их всех - см. мой ответ для деталей). Хотя все они делают задание, этот делает это, самое быстрое - даже кажется быстрее, чем Система. Xml. Узел. Сам InnerXml! – Luke Sampson 10.11.2009, 01:12
  • 2
    Этот маленький фрагмент кода был очень полезен, это должно было быть принятым ответом. – Frank Rosario 21.10.2010, 21:32
  • 3
    +1 это должно было быть принятым ответом. Luke Sampsons' ответ хорош читать, но Вы уступили корректному ответу дорогу перед ним. – Bazzz 28.03.2012, 17:31
  • 4
    XmlReader доступен, таким образом, don' t забывают обертывать его с использованием, (I' d редактируют ответ самостоятельно, если я знал VB). – Dmitry Fedorkov 25.11.2013, 14:25
  • 5
    @MichaelRopy: $result = preg_grep('~^' . $input . '~', $data); – Alix Axel 16.11.2019, 02:38

@Greg: кажется, что Вы отредактировали свой ответ, чтобы быть совершенно другим ответом. К которому мой ответ да, я мог сделать это использование System.Xml, но надеялся намочить ноги с LINQ к XML.

я оставлю свой исходный ответ ниже в случае, если кто-либо еще задается вопросом, почему я не могу только использовать.Value свойство XELEMENT для получения то, в чем я нуждаюсь:

@Greg: свойство Value связывает все текстовое содержание любых дочерних узлов. Таким образом, если элемент тела содержит только текст, это работает, но если это содержит XHTML, я получаю весь текст, связанный вместе, но ни один из тегов.

2
ответ дан 05.10.2019, 12:17
  • 1
    Я столкнулся с этой точно той же самой проблемой и думал, что это была ошибка: у Меня было ' mixed' содержание (т.е. <root>random text <sub1>child</sub1> <sub2>child</sub2></root>), который стал random text childchild через XElement.Parse(...).Value – drzaus 04.06.2014, 20:45

Теги

Похожие вопросы