Seq toDictionary

时间:2012-03-15 12:18:44

标签: f#

如何从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 个答案:

答案 0 :(得分:16)

要从seq构建字典,通常使用dict function。它需要一个seq的键/值元组,所以问题归结为产生这个元组序列。使用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将函数应用于序列中的每个元素,就像for / foreach循环一样,仅用于函数的副作用。除非您想要强制构建字典,即将键/值添加到现有字典中,否则它在此处没用。

答案 1 :(得分:0)

在您的示例中,Seq.iter迭代一系列'token'XElements。所以,为了编译,你的lambda应该是(有趣的xel - &gt; xel.Attribute(XName.op_Implicit“key”)。Value,xel.Attribute(“value”)。Value)。但是,即使它在此更正后编译,我建议您通过使用Mauricio的方法来简化代码。