2011-11-23 12 views
6

me han escrito un módulo # F que tiene una lista en el interior:Acceso a un F # lista desde el interior de código C#

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

ahora de una clase C# Estoy intentando acceder a la lista previamente definida, pero yo don' sé cómo convirtiéndola:

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

que iba a necesitar algo como:

IList<X> list = MyModule.l; 

¿Cómo puedo lograr eso?

Respuesta

9

tan simple como:

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

La razón por la que necesita el método de conversión en vez de un fundido/conversión implícita es debido a que un FSharpList<T> implementa IEnumerable<T> pero no IList<T> ya que representa una lista enlazada inmutable.

Tenga en cuenta que deberá incluir FSharp.Core como referencia en su proyecto de C#.

5

El FSharpList<T> (que es el nombre .Net del tipo F # list<T>) no implementa IList<T>, porque no tiene sentido.

IList<T> es para acceder y modificar colecciones a las que se puede acceder por índice, que no es list<T>. Para usarlo desde C#, puede utilizar el tipo de forma explícita:

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

O puede utilizar el hecho de que se implementa IEnumerable<T>:

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

O, si usted no necesita IList<T>, puede utilizar LINQ de ToList(), como Ani sugerido:

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

Pero hay que recordar que F # lista es inmutable y lo que no hay manera de modificarlo.

+0

sí, gracias por la sugerencia..Sé inmutable, pero no es necesario modificar la lista. Solo recupere algunos valores para representar con XNA y C# – Heisenbug

Cuestiones relacionadas