从C#代码中访问F#List <List <>>

Hei*_*bug 1 c# f# list

这是我之前的帖子的扩展.我认为访问a List<List<>>与简单列表非常相似,但我有一些问题.

这是F#代码:

type X = 
    {
        valuex : int
    }
let l = 
    [
    for i in 1 .. 10 -> 
        [
        for j in 1 .. 10 ->
            {valuex =  i * j}
        ]

    ]
Run Code Online (Sandbox Code Playgroud)

根据我之前的帖子,我尝试在C#代码中执行以下操作:

IList<IList<MyModule.X>> list = MyModule.l.ToList();
Run Code Online (Sandbox Code Playgroud)

但这不编译.
有人这是我的错误吗?

Ani*_*Ani 6

在这种情况下,属性的类型是,FSharpList<FSharpList<MyModule.X>>因此您必须将每个内部FSharpList映射到a IList<T>,然后将结果序列具体化为列表(列表).

这看起来像:

IList<IList<MyModule.X>> list = MyModule.l
                                        .Select(inner => (IList<MyModule.X>) inner.ToList())
                                        .ToList();
Run Code Online (Sandbox Code Playgroud)

你真的需要所有这些精确的转换吗?这个系列已经IEnumerable<IEnumerable<T>>足够好了吗?事实上,FSharpList<T>C#本身就是一个非常实用的类型,所以除非绝对必要,否则我会远离这些转换.

编辑:

如果你只需要迭代元素,你需要的只是一个循环:

foreach(var innerList in MyModule.l)
{
    foreach(var item in innerList)
    {
        Console.WriteLine(item.valuex);
    }     
}
Run Code Online (Sandbox Code Playgroud)

  • 声明类型为"IEnumerable <IEnumerable <MyModule.X >>"的变量,然后迭代/枚举您的内容.:)只要某些东西实现了`IEnumerable <T>`就可以迭代它而不必知道确切/具体的类型. (3认同)