Доступ к списку F # из кода C # - PullRequest
6 голосов
/ 23 ноября 2011

Я написал модуль F # со списком внутри:

module MyModule
type X = 
    {
        valuex : float32
    }
let l = [ for i in 1 .. 10 -> {valuex =  3.3f}]

Теперь из класса C # я пытаюсь получить доступ к ранее определенному списку, но не знаю, как его преобразовать:

... list = MyModule.l ; //here's my problem

Мне нужно что-то вроде:

IList<X> list = MyModule.l;

Как мне этого добиться?

Ответы [ 2 ]

10 голосов
/ 23 ноября 2011

Так же просто, как:

IList<MyModule.X> list = MyModule.l.ToList();

Причина, по которой вам нужен метод преобразования, а не приведение / неявное преобразование, заключается в том, что FSharpList<T> реализует IEnumerable<T>, но не IList<T>, поскольку он представляет неизменный связанный список.

Обратите внимание, что вам нужно будет включить FSharp.Core в качестве ссылки в ваш проект C #.

5 голосов
/ 23 ноября 2011

FSharpList<T> (то есть .Net-имя типа F # list<T>) не реализует IList<T>, потому что это не имеет смысла.

IList<T> предназначен для доступа и изменения коллекций, к которым можно получить доступ по индексу, а list<T> - нет.Чтобы использовать его из C #, вы можете использовать тип явно:

FSharpList<MyModule.X> l = MyModule.l;
var l = MyModule.l; // the same as above

Или вы можете использовать тот факт, что он реализует IEnumerable<T>:

IEnumerable<MyModule.X> l = MyModule.l;

Или, если вы делаетенужно IList<T>, вы можете использовать LINQ ToList(), как предложила Ани:

IList<MyModule.X> l = MyModule.l.ToList();

Но вы должны помнить, что список F # неизменен, и поэтому нет способа его изменить.

...