首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列号toDictionary

序列号toDictionary
EN

Stack Overflow用户
提问于 2012-03-15 20:18:44
回答 2查看 2.9K关注 0票数 5

如何从一个序列构造一个字典。我似乎不能得到正确的语法。

所以我有一个Seq,我想用它来构造一个字典,比如

文档

代码语言:javascript
复制
<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

EN

回答 2

Stack Overflow用户

发布于 2012-03-15 21:23:14

要从seq构建字典,通常使用dict function。它需要一系列的键/值元组,所以问题归结为生成这个元组序列。使用System.Xml.Linq,您可以导航XML,按顺序获取属性值。

代码如下:

代码语言:javascript
复制
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循环一样,只是为了函数的副作用。它在这里没有用处,除非你想强制构建字典,也就是向已经存在的字典中添加键/值。

票数 17
EN

Stack Overflow用户

发布于 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的方法来简化代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9719526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档