2009-03-19 3 views
9

J'ai une fonction en C# qui est appelée en F #, en passant ses paramètres dans un Microsoft.FSharp.Collections.List<object>.Récupération d'éléments d'une liste F # passée à C#

Comment puis-je obtenir les éléments de la liste F # dans la fonction C#?

EDIT

Je l'ai trouvé un moyen de boucle de type 'fonctionnelle' à travers eux, et peut les transmettre à une fonction ci-dessous pour revenir 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 AGAIN

La liste F #, comme indiqué ci-dessous, est Enumerable, donc la fonction ci-dessus peut être remplacée par la ligne; Y at-il un moyen, cependant, de référencer un élément dans la liste F # par index?

Répondre

11

En général, évitez d'exposer des types spécifiques à F # (comme le type F # 'list') dans d'autres langues, car l'expérience n'est pas très bonne (comme vous pouvez le voir).

Une liste F # est un IEnumerable, donc vous pouvez créer, par ex. un System.Collections.Generic.List de cette façon assez facilement.

Il n'y a pas d'indexation efficace, car il s'agit d'une liste à liaison unique et donc l'accès à un élément arbitraire est O (n). Si vous voulez cette indexation, il est préférable de passer à une autre structure de données.

+2

Salut! Chaque liste a son but ... http://blogs.msdn.com/chrsmith/archive/2008/07/10/mastering-f-lists.aspx Vous pouvez convertir la liste F # en IEnumerable comme ceci: mylist |> List. toSeq –

7

Dans mon C# -projet J'ai fait des méthodes d'extension pour convertir des listes entre C# et F # facilement:

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); 
    } 
} 

Ensuite, utilisez tout comme:

1

Réponse à la question éditée:

Y a-t-il un moyen, cependant, de référencer un élément de la liste F # par index?

Je préfère f # sur C# est alors voici la réponse:

let public GetListElementAt i = mylist.[i] 

retourne un élément (également pour votre code C#).

Questions connexes