F# 具有接口和linq语句的c到f转换

F# 具有接口和linq语句的c到f转换,f#,c#-to-f#,f#-3.0,F#,C# To F#,F# 3.0,我正在尝试将这个使用接口和Linq的c方法转换为f: 公共静态IEnumerable CurrentEnginebuildSie可计算thisYearModels、DateTime startRunDate、DateTime endRunDate { 变量引擎选项= currentModelYear.SelectManyc=>c.发动机 其中e=>e.EngineProdStartDate>=startRunDate&e.EngineProdStopDateIEnumerable在F中。在这种情

我正在尝试将这个使用接口和Linq的c方法转换为f:

公共静态IEnumerable CurrentEnginebuildSie可计算thisYearModels、DateTime startRunDate、DateTime endRunDate { 变量引擎选项= currentModelYear.SelectManyc=>c.发动机 其中e=>e.EngineProdStartDate>=startRunDate&e.EngineProdStopDateIEnumerable在F中。在这种情况下,我看不出有任何理由使用LINQ查询表达式;更惯用的F翻译将使用:

或在体内:

let CurrentEngineBuilds thisYearModels startRunDate endRunDate =
    (thisYearModels:seq<CurrentModels>)
    |> Seq.collect (fun c -> c.Engines)
    |> Seq.filter (fun e ->
        e.EngineProdStartDate >= startRunDate && e.EngineProdStopDate <= endRunDate)
// or
let CurrentEngineBuilds thisYearModels startRunDate endRunDate =
    thisYearModels
    |> Seq.collect (fun (c:CurrentModels) -> c.Engines)
    |> Seq.filter (fun e ->
        e.EngineProdStartDate >= startRunDate && e.EngineProdStopDate <= endRunDate)
F中的IEnumerable。在本例中,我看不出有任何理由使用LINQ查询表达式;更惯用的F翻译将使用:

或在体内:

let CurrentEngineBuilds thisYearModels startRunDate endRunDate =
    (thisYearModels:seq<CurrentModels>)
    |> Seq.collect (fun c -> c.Engines)
    |> Seq.filter (fun e ->
        e.EngineProdStartDate >= startRunDate && e.EngineProdStopDate <= endRunDate)
// or
let CurrentEngineBuilds thisYearModels startRunDate endRunDate =
    thisYearModels
    |> Seq.collect (fun (c:CurrentModels) -> c.Engines)
    |> Seq.filter (fun e ->
        e.EngineProdStartDate >= startRunDate && e.EngineProdStopDate <= endRunDate)

实际上,在F中使用LINQ没有任何问题。这是您原始示例的一个几乎直接的端口,我假设currentModelYear是一种类型,您指的是thisYearModels

在本文中,你可以把seq看作IEnumerable的简写


话虽如此,我想您会发现Seq模块更适合F,因为它的设计利用了F语言的特性,如元组,并且可以帮助进行类型推断过程。

您可以在F中实际使用LINQ,而不会出现任何问题。这是您的原始示例的一个几乎直接的端口,我假设currentMOdeleyear是一种类型,你是说今年的模特

在本文中,你可以把seq看作IEnumerable的简写

话虽如此,我认为您会发现Seq模块更适合F,因为它的设计利用了F语言的特性,如元组,并可以帮助进行类型推断过程。

or pipe操作符是F将函数应用于值的惯用方法

v |>f与前面指出的fv相同

另一方面,一元链接完全是另一回事。您在原始帖子的查询计算表达式中使用了一元链接,这也是惯用的

希望这有助于在您的理解中区分这两个相当复杂的概念:

or pipe操作符是F将函数应用于值的惯用方法

v |>f与前面指出的fv相同

另一方面,一元链接完全是另一回事。您在原始帖子的查询计算表达式中使用了一元链接,这也是惯用的


希望这有助于在您的理解中将这两个相当复杂的概念分开!:

谢谢!几个问题。我假设有趣的c->c。引擎类型的语法类似于c lambda运算符?此外,“|>”运算符做什么?再次感谢…@999cm999:是的,这是lambda的F语法。|>运算符将F v更改为v |>F,F是一元链接文档的惯用语吗?谢谢!有几个问题。我假设有趣的c->c。引擎的语法类型类似于c lambda操作符?另外,“|>”操作符做什么?再次感谢…@999cm999:是的,这是lambda的F语法。|>操作符将F v更改为v |>F,并且是F的一元链接惯用语d记录是必要的。
let CurrentEngineBuilds (thisYearModels:seq<CurrentModels>) startRunDate endRunDate = ...
let CurrentEngineBuilds thisYearModels startRunDate endRunDate =
    (thisYearModels:seq<CurrentModels>)
    |> Seq.collect (fun c -> c.Engines)
    |> Seq.filter (fun e ->
        e.EngineProdStartDate >= startRunDate && e.EngineProdStopDate <= endRunDate)
// or
let CurrentEngineBuilds thisYearModels startRunDate endRunDate =
    thisYearModels
    |> Seq.collect (fun (c:CurrentModels) -> c.Engines)
    |> Seq.filter (fun e ->
        e.EngineProdStartDate >= startRunDate && e.EngineProdStopDate <= endRunDate)
open System.Linq
let currentEngineBuilds(thisYearModels:seq<CurrentModels>, startRunDate, endRunDate) =
    let engineOptions =
        thisYearModels
            .SelectMany(fun e -> e.Engines)
            .Where(fun e -> e.StartDate >= startRunDate && e.StopDate <= endRunDate)
    engineOptions // return keyword not required