Вы очень близки, вы должны просто использовать форму 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))
Удивление, если (замечают, что я избавился от 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 () называют мой инвертировать это, но я просто хотел предложить другое предложение.
Действительно ли возможно использовать объекты пространства имен System.Xml сделать задание здесь вместо того, чтобы использовать LINQ? Поскольку Вы уже упомянули, XmlNode. InnerXml точно, в чем Вы нуждаетесь.
Я закончил тем, что использовал это:
Body = t.Element("body").Nodes().Aggregate("", (b, node) => b += node.ToString());
Как насчет того, чтобы использовать этот "дополнительный" метод на 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
только Элемент.
Я думаю, что это - намного лучший метод (в VB, не должно быть твердо перевести):
, Учитывая XElement x:
Dim xReader = x.CreateReader
xReader.MoveToContent
xReader.ReadInnerXml
@Greg: кажется, что Вы отредактировали свой ответ, чтобы быть совершенно другим ответом. К которому мой ответ да, я мог сделать это использование System.Xml, но надеялся намочить ноги с LINQ к XML.
я оставлю свой исходный ответ ниже в случае, если кто-либо еще задается вопросом, почему я не могу только использовать.Value свойство XELEMENT для получения то, в чем я нуждаюсь:
@Greg: свойство Value связывает все текстовое содержание любых дочерних узлов. Таким образом, если элемент тела содержит только текст, это работает, но если это содержит XHTML, я получаю весь текст, связанный вместе, но ни один из тегов.
<root>random text <sub1>child</sub1> <sub2>child</sub2></root>
), который стал random text childchild
через XElement.Parse(...).Value
– drzaus
04.06.2014, 20:45