У меня нет Active Directory, поэтому я не смог проверить это. Тем не менее, одна строка в вашем коде, которая определенно неверна, следующая:
results |> List.append <| a |> ignore
Я полагаю, вы пытаетесь добавить новое значение a
в список results
, но F # списки являются неизменяемыми, так что это просто создает новый список и затем игнорирует его, используя ignore
.
Использование списочных представлений, как вы пытались в закомментированной версии, безусловно, является одним из хороших способов добиться этого. Правильный синтаксис, включающий ваш код match
, будет таким:
let newSearchResults =
[ for u in searchResults do
match u with
| null -> printfn ""
| u when u.ToString() = ""-> printfn ""
| _ -> let r = u.GetDirectoryEntry()
yield r.Properties.["samaccountname"].Value.ToString() ]
В качестве альтернативы вы можете использовать такие функции, как List.map
и List.filter
. Одно предостережение в том, что dSearcher.FindAll
не возвращает обобщенный c IEnumerabl
, и поэтому вам требуется дополнительная работа, чтобы превратить этот результат в обычный список F # - простое понимание списка может сделать это для вас:
let searchResults = [ for r in dSearcher.FindAll() -> r ]
let newSearchResults =
searchResults
|> List.filter (fun u -> u <> null && u.ToString() <> "")
|> List.map (fun u ->
let r = u.GetDirectoryEntry()
r.Properties.["samaccountname"].Value.ToString())