如何在f#中加入这个Join ?

  • 本文关键字:Join .net linq lambda f#
  • 更新时间 :
  • 英文 :


我在c#中有一个lambda连接,看起来像这样:

int[] arrX = { 1, 2, 3 };
int[] arrY = { 3, 4, 5 };
var res = arrX.Join(arrY, x => x, y => y, (x, y) => x);

执行后res包含3,这对两个数组都是通用的。

我想在f#中做完全相同的lambda连接,并尝试:

let arrX = [| 1; 2; 3 |]
let arrY = [| 3; 4; 5 |]
let res = arrX.Join(fun arrY, fun x -> x, fun y -> y, fun (x, y) -> x)

但是编译器说:

lambda表达式中意外的符号','。期望'->'或其他标记

错误是第一个参数arrY后面的逗号。

你能告诉我如何让它工作(作为lambda表达式)吗?

这将在f# -interactive中为我工作(并且是从您的c#代码直接翻译):

open System
open System.Linq
let arrX = [| 1; 2; 3 |]
let arrY = [| 3; 4; 5 |]
let res = arrX.Join(arrY, Func<_,_>(id), Func<_,_>(id), (fun x _ -> x))

在执行了res之后看起来像这样:

> res;;
val it : Collections.Generic.IEnumerable<int> = seq [3]
<标题>评论

如果你喜欢,你可以写

let res = arrX.Join(arrY, (fun x -> x), (fun x -> x), fun x _ -> x)

正如@RCH提议的那样

请注意,使用f#核心库至少有两种方法可以做到这一点。

let arrX = [| 1; 2; 3 |]
let arrY = [| 3; 4; 5 |]
//method 1 (does not preserve order)
let res1 = Set.intersect (set arrX) (set arrY)
//method 2
let res2 = 
    query { 
        for x in arrX do
        join y in arrY on (x = y)
        select x
    }

我大胆建议如下:

open System
open System.Linq
let arrX = [| 1; 2; 3 |]
let arrY = [| 3; 4; 5 |]
let res = Set.intersect (Set.ofArray arrX) (Set.ofArray arrY) |> Set.toArray

或者选择一些完全的"混淆风格":

let res' = arrX |> Set.ofArray |> Set.intersect <| (Set.ofArray <| arrY) |> Set.toArray

我猜res'-version是不推荐的…

: -)

相关内容

  • 没有找到相关文章

最新更新