如何从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
答案 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的方法来简化代码。