Извлечение элементов из списка F #, переданного в C # - PullRequest
9 голосов
/ 19 марта 2009

У меня есть функция в C #, которая вызывается в F #, передавая ее параметры в Microsoft.FSharp.Collections.List<object>.

Как я могу получить элементы из списка F # в функции C #?

EDIT

Я нашел «функциональный» стиль для их обхода и могу передать их функции, как показано ниже, для возврата 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;
 }

ИЗМЕНИТЬ СНОВА

Список F #, как было указано ниже, является Enumerable, поэтому указанную выше функцию можно заменить на строку;

new List<LiteralType>(parameters);

Можно ли, однако, ссылаться на элемент в списке F # по индексу?

Ответы [ 3 ]

11 голосов
/ 19 марта 2009

В целом, избегайте выставления F # -специфических типов (например, типа F # 'list') другим языкам, потому что опыт не так уж велик (как вы можете видеть).

Список F # является IEnumerable, поэтому вы можете создать, например, System.Collections.Generic.List из этого списка довольно легко.

Эффективной индексации не существует, так как это односвязный список, и поэтому доступ к произвольному элементу - это O (n). Если вы хотите эту индексацию, лучше всего перейти на другую структуру данных.

7 голосов
/ 27 июля 2009

В моем C # -проекте я сделал методы расширения для простого преобразования списков между C # и F #:

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

Тогда используйте так же, как:

var lst = new List<int> { 1, 2, 3 }.ToFSharplist();
1 голос
/ 04 февраля 2010

Ответ на отредактированный вопрос:

Можно ли, однако, ссылаться на элемент в списке F # по индексу?

Я предпочитаю f # над c #, вот ответ:

let public GetListElementAt i = mylist.[i]

возвращает элемент (также для вашего кода C #).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...