2011-11-23 25 views
6

Pisałem moduł F #, który ma listę Wewnątrz:Dostęp do listy # F od wewnątrz kodu C#

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

Teraz z klasy C# Próbuję uzyskać dostęp do wcześniej zdefiniowanej listy, ale don” t wiedzieć, jak przekształcenie go:

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

że muszę coś takiego:

IList<X> list = MyModule.l; 

Jak mogę to osiągnąć?

Odpowiedz

9

proste:

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

Powodem trzeba metodę konwersji zamiast obsady/niejawna konwersja jest ponieważ FSharpList<T> realizuje IEnumerable<T> ale nie IList<T> ponieważ stanowi ona niezmienna linkowane listy.

Pamiętaj, że będziesz musiał podać FSharp.Core jako odniesienie w projekcie C#.

5

Nazwa FSharpList<T> (która jest nazwą .Net typu F # list<T>) nie implementuje IList<T>, ponieważ nie ma to sensu.

IList<T> służy do uzyskiwania dostępu i modyfikowania kolekcji, do których można uzyskać dostęp za pomocą indeksu, którego nie ma list<T>. Aby z niego skorzystać z C#, można użyć typu wyraźnie:

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

Albo można użyć fakt, że realizuje IEnumerable<T>:

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

Lub, jeśli potrzebują IList<T>, można użyć LINQ na ToList(), jak Ani sugerował:

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

Ale trzeba pamiętać, że lista F # jest niezmienna, a więc nie ma sposobu, aby go zmodyfikować.

+0

Tak, dziękuję za sugestię .. Wiem o niezmienności, ale nie muszę modyfikować listy. Po prostu pobierz niektóre wartości do renderowania za pomocą XNA i C# – Heisenbug

Powiązane problemy