【问题标题】:Accessing an F# List<List<>> from inside C# code从 C# 代码内部访问 F# List<List<>>
【发布时间】:2012-01-05 19:22:57
【问题描述】:

这是my previous thread 的扩展。 我认为访问List&lt;List&lt;&gt;&gt; 与简单列表非常相似,但我遇到了一些问题。

这是 F# 代码:

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

    ]

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

IList<IList<MyModule.X>> list = MyModule.l.ToList();

但这不能编译。
有人可以说是我的错误吗?

【问题讨论】:

    标签: c# list f#


    【解决方案1】:

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

    这看起来像:

    IList<IList<MyModule.X>> list = MyModule.l
                                            .Select(inner => (IList<MyModule.X>) inner.ToList())
                                            .ToList();
    

    您真的需要所有这些精确转换吗?集合已经是IEnumerable&lt;IEnumerable&lt;T&gt;&gt; 的事实还不够好吗?事实上,FSharpList&lt;T&gt; 本身是 C# 中非常有用的类型,所以除非绝对必要,否则我会远离这些转换。

    编辑

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

    foreach(var innerList in MyModule.l)
    {
        foreach(var item in innerList)
        {
            Console.WriteLine(item.valuex);
        }     
    }
    

    【讨论】:

    • 好吧,其实我不知道。我是 C# 和 F# 新手。关键是我在 f# 中有一个 List ,我必须在 C# 中遍历它。如果您知道更好的解决方案,请!让我朝着正确的方向前进。
    • 声明IEnumerable&lt;IEnumerable&lt;MyModule.X&gt;&gt; 类型的变量,然后迭代/枚举到你的心内容。 :) 只要某些东西实现了IEnumerable&lt;T&gt;,它就可以被迭代,而不必知道确切/具体的类型。
    猜你喜欢
    • 2012-01-21
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2023-01-26
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多