Метод расширения Single () выдает исключение, если не находит соответствия, и также выдает исключение, если находит более одного совпадения.В модуле F # Seq
прямого эквивалента нет.Ближайшим будет Seq.find
, который, например, .Single()
, выдаст исключение, если не найдет совпадение, однако, в отличие от .Single()
, он перестанет искать, как только найдет совпадение, и не выдаст ошибку, если большесуществует более одного совпадения.
Если вам действительно нужно поведение «выбросить ошибку, если более одного совпадения», то проще всего будет использовать этот точный метод из F #:
open System.Linq
let p = userPlaylists.Entries.Single(fun x -> x.Title = "playlistname")
Если вам не нужно поведение «бросить, если более одного совпадения», то вам не следует использовать .Single()
в вашем коде на C # - .First()
будет работать лучше, потому что он перестает смотреть, как только находитсовпадение.
Если бы это был я, я бы использовал краткость Seq.tryFind
over Seq.tryPick
и обрабатывал бы случай "not found", а не выдавал ошибку.
let userPlaylists = request.GetPlaylistsFeed("username")
let p = userPlaylists.Entries |> Seq.tryFind (fun x -> x.Title = "playlistname")
match p with
| Some pl ->
// do something with the list
| None ->
// do something else because we didn't find the list
Или, альтернативно, я мог бы сделать это без создания промежуточных значений, на которые ссылаются только один раз ...
request.GetPlaylistsFeed("username").Entries
|> Seq.tryFind (fun x -> x.Title = "playlistname")
|> function
| Some pl ->
// do something with the list
| None ->
// do something else because we didn't find the list
Мне действительно нравится оператор конвейера ...