Pregunta

El uso de un código para convertir IList<T> a un FSharpList<T> a continuación, escribir la lista de valores a un XML.

public static class Interop
{
    public static FSharpList<T> ToFSharpList<T>(this IList<T> input)
    {
        return CreateFSharpList(input, 0);
    }

    private static FSharpList<T> CreateFSharpList<T>(IList<T> input, int index)
    {
        if(index >= input.Count)
        {
            return FSharpList<T>.Empty;
        }
        else
        {
            return FSharpList<T>.Cons(input[index], CreateFSharpList(input, index + 1));
        }
    }
}

Yo uso el código de arriba para hacer mi propia lista

var fsharp_distinct = distinctWords.ToFSharpList();
var distinct_without_stopwords = Module2.stopword(fsharp_distinct);

foreach (string wd in distinct_without_stopwords)
    colwordfreq.Root.Add(new XElement(wd));

De hecho, el XML está escrito demasiado, pero justo antes de salir del bucle se da un System.NullReferenceException.Pero cuando una función F# devuelve un Tuple<string, int> utilizando el mismo código que yo no he tenido problemas para escribir la Tupla de valores a un XML.

EDITAR: Yo no era correcta en la pregunta anterior.El punto nulo excepción viene en realidad de este código:

foreach (Tuple<string, int> pair in list2)
    colwordfreq.Root.Element(pair.Item1).Add(new XElement("freq", pair.Item2));

Pero cuando he añadido la condición de

if (colwordfreq.Root.Element(pair.Item1) != null)

No da que la excepción.

¿Fue útil?

Solución

Su ejemplo es un poco incompleto, pero si colwordfreq.Root.Element(pair.Item1) devuelve null para algunas palabras, probablemente significa que usted no agregar ese elemento previamente.Tal vez usted necesita para agregar elementos por escribir algo como:

foreach (Tuple<string, int> pair in list2) 
  colwordfreq.Root.Add                                // Add element to the root
    (new XElement(pair.Item1,                         // with the name of the word
                  new XElement("freq", pair.Item2))); // ... and the count

A un lado, cuando usted está llamando a F# código de C#, es digno de la comprobación hacia fuera de la F# componente pautas de diseño.Una de las sugerencias que hay (que yo recomiendo a seguir) es evitar el uso de F# tipos específicos (como FSharpList) desde C#.Estos son realmente diseñado para F# y son difíciles de usar correctamente desde C#.

Usted puede agregar un simple F# función de contenedor que expone la funcionalidad de usar IEnumerable, que será mucho más fácil el uso de C#:

let rec stopword a = 
    match a with 
    |"the"::t |"this"::t -> stopword t 
    |h::t ->h::(stopword t) 
    |[] -> [] 

module Export = 
  let StopWord (inp:seq<_>) = 
    (inp |> List.ofSeq |> stopword) :> seq<_>

A continuación, puedes llamar Export.StopWord(en) desde C# sin explícitamente tratar con F# listas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top