0

Map に変換する必要がある NameValueCollection がありますが、うまくいきません。私は試した:

let headerMap (m : MailMessage) = m.Headers |> Map.map (fun k v -> v.[k])

代わりに Seq.map を使用する必要がありますか?

基本的に、これのポイントは、System.Net.MailMessage のヘッダーを JSON にシリアル化したいということです。

4

2 に答える 2

5
nvc.AllKeys
|> Seq.map (fun key -> key, nvc.[key])
|> Map.ofSeq
于 2012-12-01T15:10:02.533 に答える
5

ダニエルの答えは問題なく機能しますが、いくつかの追加の代替手段を提供すると思いました:

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
于 2012-12-01T16:40:32.167 に答える