2013-03-06 14 views
7

In einer vorgegebenen Liste ein bisschen wie (vereinfacht):Liste der Objekte Collections.map

type foo(n:string,m:string,l:string) = 
    member f.name=n 
    member f.val1=m 
    member f.val2=l 
let dates = [ 
    foo("a","aa","aaa") 
    foo("b","bb","bbb") 
] 

Wie kann aa unveränderlich Wörterbuch-Struktur (? ZB Karte, IDictionary ... alle anderen) der Form key:foo.name,value:foo gemacht werden?

Meine beste Vermutung war

let fooDict = for f in foo do yield f.name,f 

Aber die für Verständnis Syntax kann nur verwendet werden, um eine Liste, Array zu machen, oder f?

Antwort

12

Um eine unveränderliche Wörterbuch (die Schnittstelle ist wandelbar, aber wird eine Ausnahme ausgelöst, wenn Sie versuchen, es zu ändern) zu erstellen

[ for f in dates -> f.name,f ] |> dict 

oder

dates |> Seq.map (fun f -> f.name, f) |> dict 


So erstellen Sie ein unveränderlich Karte:

oder

dates |> Seq.map (fun f -> f.name, f) |> Map.ofSeq 
+0

Schön. Ich habe nicht verstanden, dass ich das Ertragstupel in eine Map.ofSeq pipen konnte. Sehr hilfreich, um die syntaktischen Optionen zu sehen. – Noel

+0

@Gustavo: wusste nicht über Diktat, nette Kurzschrift, aber es schafft ein unveränderliches Wörterbuch, nicht änderbar. Es scheint einen Objektausdruck zu verwenden, daher ist der Typ nicht sofort offensichtlich: 'd.GetType(). FullName'-> [email protected] .. type params. Sie können dem resultierenden IDictionary jedoch nicht zuweisen. –

+0

Humm, wenn Sie versuchen, Elemente hinzuzufügen, wirft es eine NotSupportedException, wusste nicht darüber, ich nahm an, dass es ein normales Wörterbuch zurückgegeben hat. Ich habe die Antwort aktualisiert –

2

Überprüfen Sie die dict Funktion - es nimmt eine Sequenz von Schlüssel-Wert-Tupel und erstellt ein unveränderliches Wörterbuch von ihnen.

Mit einer Liste wie die, die Sie zur Verfügung gestellt haben, könnten Sie Seq.map verwenden, um die Sequenz zu erstellen, und dann in dict leiten.

+3

Konkret 'Termine |> Seq.map (fun f -> f.name, f) |> dict' oder 'dates |> Seq.map (fun f -> f.name, f) |> Map.ofSeq'. – ildjarn

3

ich mit den ausführlicheren (und unwissend von Rohren) endete:

Map.ofList([for f in foo do yield (f.name,f)]) 
+3

Beachten Sie, dass die Klammern um die Liste nicht erforderlich sind - das macht diese Notation wirklich ziemlich nett (denke ich). –

+4

Und wenn Sie verwenden -> anstelle der Ausbeute wird es noch schöner: 'Map.ofList [für f in foo -> f.name, f]' –

Verwandte Themen