如何从一个序列构造一个字典。我似乎不能得到正确的语法。
所以我有一个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
发布于 2012-03-15 21:23:14
要从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)
|> dictSeq.head返回序列的第一个元素,它在这里没有用处,除非你想用它来覆盖节点。
Seq.iter将函数应用于序列中的每个元素,就像for/foreach循环一样,只是为了函数的副作用。它在这里没有用处,除非你想强制构建字典,也就是向已经存在的字典中添加键/值。
发布于 2012-03-15 21:31:36
在您的示例中,Seq.iter遍历了一系列“XElements”令牌。因此,为了进行编译,您的lambda应该是(fun xel -> xel.Attribute(XName.op_Implicit "key").Value, xel.Attribute("value").Value)。但是,即使在此更正之后编译,我也建议您使用g Mauricio的方法来简化代码。
https://stackoverflow.com/questions/9719526
复制相似问题