Ответ Дэниела будет работать нормально, но я подумал, что предлагаю дополнительные альтернативы:
Array.fold - это должно быть быстрее, чем версия Даниэля, поскольку позволяет избежать накладных расходов на итераторы.
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
person
Jack P.
schedule
01.12.2012