如何在F#中执行linq-to-IEnumerable样式的联接

hwamh0ep  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(112)

我有一个项目,我试图将其转换为F#,其中包含大量的linq-to-IEnumerable样式查询。我很好奇在F#中执行多个列表的连接的最佳方式是什么。例如,如果我有一堆C#代码,如以下``
`

var joinedList =
            from val1 in list1
            join val2 in list2 on val1.Key equals val2.Parent
            join val3 in list3 on val1.Key equals val3.Parent
            orderby val1
            select new {val1, val2, val3};

`
``将其转换为F#的最佳方法是什么?我将保留“最佳”的定义,但我正在寻找一些功能性的而不是命令性的东西,最好不要将我的列表转换为seq和/或导入System. Linq。懒惰和急切的解决方案都将是有用的。当然,可重用性是关键,因为我到处都有这样的查询。如果有任何方法可以使用工作流来使语法更优雅,那就太好了。

jckbn6z7

jckbn6z71#

在Don关于LINQ和Powerpack的博客中:
Link
它展示了如何进行LINQ join调用。但当然这是在seq上使用LINQ。他还指出join类似于条件。所以我认为,例如,您的示例类似于

let joinedList = [
    for v1 in l1 do
    for v2 in l2 do
    if v1.Key = v2.Parent then
    for v3 in l3 do
    if v1.Key = v3.Parent then
    yield (v1, v2, v3)] |> List.sort

虽然我还没有用真实的数据来验证。

mzaanser

mzaanser2#

第一次尝试在简化版本上使用管道(忽略list3):

let res = list1
          |> Seq.collect (fun v1 -> Seq.filter (fun v2 -> v1.Key = v2.Parent) list2 |> Seq.map (fun v2 -> (v1,v2))
          |> Seq.sortBy (fun (x,y) -> x)

这将留下IEnumerable<Tuple<T1,T2>>。第二个collect和map将加入第三个列表

相关问题