HashSet `.ToArray ()` используя F # - PullRequest
1 голос
/ 02 ноября 2011

Что мне нужно сделать, чтобы иметь возможность вызвать .ToArray () для HashSet?Я пробовал следующее, но это не сработало:

let a = System.Collections.Generic.HashSet ()
a.Add 5 |> ignore
a.ToArray () // Not possible
let b = a :> System.Collections.IEnumerable
b.ToArray () // Not possible

Здесь , это заявлено:

ToArray: Создает массив из IEnumerable.(Определено в Enumerable.)

, поэтому должен быть способ.

Ответы [ 3 ]

6 голосов
/ 02 ноября 2011

IEnumerable.ToArray () определяется как метод расширения в System.Linq.Или используйте Seq.toArray или Array.ofSeq.

open System.Collections.Generic
open System.Linq

let hs = HashSet()
hs.Add 4
hs.Add 2

let arr = hs.ToArray()       // needs System.Linq
let arr2 = hs |> Seq.toArray // provided by F#
3 голосов
/ 02 ноября 2011

Тип HashSet реализует стандартный универсальный тип IEnumerable<'T> (называемый seq<'T> в F #), поэтому вы можете использовать Seq.toArray (без открытия каких-либо пространств имен):

let hs = System.Collections.Generic.HashSet()
hs.Add(1)

let ar = hs |> Seq.toArray

Использование метода расширения C # ToArray также будет работать (если вы откроете System.Linq), но я считаю, что использование стандартных функций F # более идиоматично.

0 голосов
/ 02 ноября 2011

Я считаю, что это метод расширения, поэтому вам нужно открыть пространство имен, содержащее Enumerable (Linq?), Чтобы получить его, как в C #.

...