2009-03-19 18 views
9

Tengo una función en C# a la que se llama en F #, pasando sus parámetros en Microsoft.FSharp.Collections.List<object>.Recuperar elementos de una lista F # pasada a C#

¿Cómo puedo obtener los elementos de la lista F # en la función C#?

EDITAR

he encontrado una manera 'funcional' estilo de bucle a través de ellos, y puede pasar a una función de la siguiente manera para volver C# System.Collection.List:

private static List<object> GetParams(Microsoft.FSharp.Collections.List<object> inparams) 
{ 
    List<object> parameters = new List<object>(); 
    while (inparams != null) 
    { 
     parameters.Add(inparams.Head); 
     inparams = inparams.Tail; 
    } 
    return inparams; 
} 

EDIT OTRA VEZ

La Lista F #, como se señaló a continuación, es Enumerable, por lo que la función anterior se puede reemplazar con la línea;

new List<LiteralType>(parameters); 

¿Hay alguna manera, sin embargo, para hacer referencia a un elemento en la lista F # por índice?

Respuesta

11

En general, evite exponer los tipos específicos de F # (como el tipo F # 'list') a otros idiomas, porque la experiencia no es tan buena (como puede ver).

Una lista F # es un IEnumerable, por lo que puede crear, p. un System.Collections.Generic.List de esa manera bastante fácil.

No existe una indexación eficiente, ya que es una lista enlazada individualmente, por lo que acceder a un elemento arbitrario es O (n). Si desea esa indexación, cambiar a otra estructura de datos es lo mejor.

+2

¡Hola! Cada lista tiene su propósito ... http://blogs.msdn.com/chrsmith/archive/2008/07/10/mastering-f-lists.aspx Puede convertir la lista F # en IEnumerable de esta manera: mylist |> List. toSeq –

7

En mi C# -project hice métodos de extensión para convertir las listas entre C# y F # fácilmente:

using System; 
using System.Collections.Generic; 
using Microsoft.FSharp.Collections; 
public static class FSharpInteropExtensions { 
    public static FSharpList<TItemType> ToFSharplist<TItemType>(this IEnumerable<TItemType> myList) 
    { 
     return Microsoft.FSharp.Collections.ListModule.of_seq<TItemType>(myList); 
    } 

    public static IEnumerable<TItemType> ToEnumerable<TItemType>(this FSharpList<TItemType> fList) 
    { 
     return Microsoft.FSharp.Collections.SeqModule.of_list<TItemType>(fList); 
    } 
} 

Luego usa como si fuera:

1

respuesta a la pregunta Editado:

¿Hay alguna manera, sin embargo, para hacer referencia a un elemento en la lista F # por índice?

prefiero F # C# sobre lo que aquí está la respuesta:

let public GetListElementAt i = mylist.[i] 

devuelve un elemento (también para su código C#).

Cuestiones relacionadas