Seq toDictionary - PullRequest
       4

Seq toDictionary

4 голосов
/ 15 марта 2012

Как мне построить словарь из Seq. Кажется, я не могу правильно понять синтаксис.

Итак, у меня есть Seq, и я хотел бы создать из него словарь, что-то вроде

Документ

<Overrides>
  <token key="A" value="1"/>
  <token key="B" value="2"/>
  <token key="C" value="3"/>
  <token key="D" value="4"/>
  <token key="E" value="5"/>
  <token key="F" value="6"/> 





let elem = docs |> Seq.map(fun x -> x.Descendants(XName.op_Implicit "Overrides").Elements(XName.op_Implicit "token"))
            |> Seq.head
            |> Seq.iter(fun (k: XElement , v:XElement) ->  k.Attribute(XName.op_Implicit "key").Value, v.Attribute("value").Value) 

но получите ошибку во время выполнения

Ошибка 1 Ожидается, что это выражение будет иметь тип XElement, но здесь имеет тип 'a *' b

Ответы [ 2 ]

16 голосов
/ 15 марта 2012

Чтобы построить словарь из seq, вы обычно используете dict функцию . Требуется последовательность кортежей ключ / значение, поэтому проблема сводится к созданию этой последовательности кортежей. С System.Xml.Linq вы перемещаетесь по XML, чтобы получить значения атрибутов в последовательности.

Вот код:

let x = @"<Overrides>
  <token key='A' value='1'/>
  <token key='B' value='2'/>
  <token key='C' value='3'/>
  <token key='D' value='4'/>
  <token key='E' value='5'/>
  <token key='F' value='6'/>
  </Overrides>"

#if INTERACTIVE
#r "System.Xml"
#r "System.Xml.Linq"
#endif

open System.Xml.Linq

let docs = XDocument.Parse x

let elem = docs.Root.Descendants(XName.Get "token")
            |> Seq.map (fun x -> x.Attribute(XName.Get "key").Value, x.Attribute(XName.Get "value").Value)
            |> dict

Seq.head возвращает первый элемент последовательности, здесь это бесполезно, если вы не хотите использовать его для перехода к узлу переопределений.

Seq.iter применяет функцию к каждому элементу в последовательности, очень похожей на цикл for / foreach, только для побочных эффектов функции. Здесь это бесполезно, если только вы не хотите создавать словарь, то есть добавлять ключ / значения в уже существующий словарь.

0 голосов
/ 15 марта 2012

В вашем примере, Seq.iter перебирает последовательность XElements 'token'.Итак, для компиляции ваша лямбда должна быть (fun xel -> xel.Attribute (XName.op_Implicit "key"). Value, xel.Attribute ("value"). Value).Однако, даже если он компилируется после этого исправления, я рекомендую упростить код, используя подход Маурисио.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...