2012-03-15 5 views
4

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

Так у меня есть 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

+0

Поскольку это почти наверняка включает в себя вывод типа, вам нужно предоставить больше своего кода. Нам нужно определение элема как минимум. –

+0

добавил документ im parsing и мой код – netmatrix01

ответ

15

Чтобы создать словарь из seq, вы обычно используете dict function. Он занимает несколько ключевых/значений кортежей, поэтому проблема сводится к созданию этой последовательности кортежей. С помощью 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 возвращает первый элемент последовательности, это не полезно здесь, если вы не хотите использовать его, чтобы добраться до узла Overrides.

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

0

В вашем примере Seq.iter выполняет итерацию по последовательности «токенов» XElements. Итак, для компиляции ваша лямбда должна быть (fun xel -> xel.Attribute (XName.op_Implicit «ключ»). Значение, xel.Attribute («значение»). Значение). Однако, даже если он компилируется после этой коррекции, я рекомендую вам упростить код с помощью подхода usinig Mauricio.

Смежные вопросы