Map に変換する必要がある NameValueCollection がありますが、うまくいきません。私は試した:
let headerMap (m : MailMessage) = m.Headers |> Map.map (fun k v -> v.[k])
代わりに Seq.map を使用する必要がありますか?
基本的に、これのポイントは、System.Net.MailMessage のヘッダーを JSON にシリアル化したいということです。
Map に変換する必要がある NameValueCollection がありますが、うまくいきません。私は試した:
let headerMap (m : MailMessage) = m.Headers |> Map.map (fun k v -> v.[k])
代わりに Seq.map を使用する必要がありますか?
基本的に、これのポイントは、System.Net.MailMessage のヘッダーを JSON にシリアル化したいということです。
nvc.AllKeys
|> Seq.map (fun key -> key, nvc.[key])
|> Map.ofSeq
ダニエルの答えは問題なく機能しますが、いくつかの追加の代替手段を提供すると思いました:
Array.fold -- イテレータのオーバーヘッドを回避するため、Daniel のバージョンよりも高速になるはずです。
let mapOfNameValueCollection (collection : NameValueCollection) =
(Map.empty, collection.AllKeys)
||> Array.fold (fun map key ->
let value = collection.[key]
Map.add key value map)
値のセットを含む Array.fold -- 上記のコードに似ていますが、値を として返します。Set<string>
これは、返された値のセットに値があるかどうかを判断する場合に役立ちます。
let mapOfNameValueCollection (collection : NameValueCollection) =
(Map.empty, collection.AllKeys)
||> Array.fold (fun map key ->
let valueSet =
match collection.[key] with
| null ->
Set.empty
| values ->
Set.ofArray <| values.Split [| ',' |]
Map.add key valueSet map)
再帰ループ-- 再帰ループを使用してアイテムごとにマップを作成します。Array.fold
バージョンの方が簡単で高速なので、実際にはこれを使用しません。ただし、使用している特定のコレクション クラス (から派生NameValueCollection
) がプロパティをオーバーライドしAllKeys
、プロパティ値を返すのに時間がかかる奇妙な内部動作がある場合、このアプローチはより高速になる可能性があります。
let mapOfNameValueCollection (collection : NameValueCollection) =
let rec createMap map idx =
if idx < 0 then map
else
let itemName = collection.GetKey idx
let itemValue = collection.[itemName]
let map = Map.add itemName itemValue map
createMap map (idx - 1)
createMap Map.empty (collection.Count - 1)
命令ループ-- 命令ループでアイテムごとにマップを作成します。再帰ループと同様に、Array.fold
特別な理由がない限り、実際に使用することをお勧めします。
let mapOfNameValueCollection (collection : NameValueCollection) =
let mutable map = Map.empty
let maxIndex = collection.Count - 1
for i = 0 to maxIndex do
let itemName = collection.GetKey i
let itemValue = collection.[itemName]
map <- Map.add itemName itemValue map
map