2009-03-19 16 views
9

Ho una funzione in C# chiamata in F #, passando i suoi parametri in un Microsoft.FSharp.Collections.List<object>.Recupero di elementi da un elenco F # passato a C#

Come posso ottenere gli elementi dall'elenco F # nella funzione C#?

EDIT

ho trovato un modo 'funzionali' stile loop attraverso di loro, e li posso passare a una funzione, come di seguito per tornare 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

L'elenco F #, come indicato di seguito, è Enumerable, quindi la funzione sopra riportata può essere sostituita con la riga;

new List<LiteralType>(parameters); 

Esiste comunque un modo per fare riferimento a un elemento nell'elenco F # per indice?

risposta

11

In generale, evitare di esporre tipi specifici di F # (come il tipo di lista F #) ad altre lingue, perché l'esperienza non è poi così grande (come puoi vedere).

Un elenco F # è un oggetto IEnumerable, quindi è possibile creare ad es. un System.Collections.Generic.List da esso in quel modo abbastanza facilmente.

Non esiste un'indicizzazione efficiente, poiché si tratta di un elenco a link singolo e quindi l'accesso a un elemento arbitrario è O (n). Se si desidera tale indicizzazione, è preferibile passare a un'altra struttura dati.

+2

Ciao! Ogni elenco ha il suo scopo ... http://blogs.msdn.com/chrsmith/archive/2008/07/10/mastering-f-lists.aspx Puoi convertire l'elenco F # in IEnumerable in questo modo: lista> lista. toSeq –

7

Nel mio C# -project ho fatto i metodi di estensione per convertire le liste tra C# e F # facilmente:

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

quindi utilizzare come solo:

1

risposta alla domanda modificato:

Esiste comunque un modo per fare riferimento a un elemento nell'elenco F # per indice?

preferisco f # sopra C# ecco la risposta:

let public GetListElementAt i = mylist.[i] 

restituisce un elemento (anche per il vostro codice C#).

Problemi correlati