2012-03-15 3 views
4

Seq에서 사전을 어떻게 구성합니까? 문법을 제대로 이해하지 못하는 것 같습니다.Seq toDictionary

그래서 나는 서열이 있고 난 런타임 오류를

문서

<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

type XElement이지만 여기에 'a *'유형이 있습니다.

+0

거의 확실하게 형식 유추가 필요하므로 더 많은 코드를 제공해야합니다. 우리는 최소한 elem의 정의가 필요합니다. –

+0

문서를 구문 분석하고 코드를 추가했습니다. – 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은 시퀀스의 첫 번째 요소를 반환하면 재정의 노드에이를 때까지 사용하지 않으려면이 여기에 유용한 아니다 :

여기에 코드입니다.

Seq.iter은 함수의 부작용만을 위해 for/foreach 루프와 같은 시퀀스의 각 요소에 함수를 적용합니다. 사전을 필수적으로 작성하려는 경우 (예 : 기존 사전에 키/값 추가)를 제외하고는 유용하지 않습니다.

0

예제에서 Seq.iter는 '토큰'XElements 시퀀스를 반복합니다. 따라서 컴파일하려면 람다가 (xel -> xel.Attribute (XName.op_Implicit "key"), Value, xel.Attribute ("value") Value)가되어야합니다. 그러나이 수정 후 컴파일하더라도 Mauricio의 접근 방식을 사용하여 코드를 단순화하는 것이 좋습니다.

관련 문제