gpt4 book ai didi

F# 管道从上面的管道阶段访问数据

转载 作者:行者123 更新时间:2023-12-03 21:09:29 26 4
gpt4 key购买 nike

我写过这样的函数

let GetAllDirectAssignmentsforLists (spWeb : SPWeb) =    
spWeb.Lists
|> Seq.cast<SPList>
|> Seq.filter(fun l -> l.HasUniqueRoleAssignments)
|> Seq.collect (fun l -> l.RoleAssignments
|> Seq.cast<SPRoleAssignment>
|> Seq.map(fun ra -> ra.Member)
)
|> Seq.filter (fun p -> p.GetType().Name = "SPUser")
|> Seq.map(fun m -> m.LoginName.ToLower())

我想返回一个元组,其中包含发送管道中的列表名称(取自 l.Title)和 m.LoginName.ToLower()

是否有一条干净的 channel 可以让我从上面的管道元件中得到一些东西?

当然,一种方法是在管道的第二阶段对返回值进行元组处理,然后一直向下传递标题....但这会污染代码,所有后续阶段都必须接受并返回元组values 只是为了最后阶段的取值。

我想知道是否有一种干净简单的方法....

此外,在管道的第 4 阶段 (fun p -> p.GetType().Name = "SPUser") 我可以使用 if here 来比较类型吗?而不是将 typename 转换为 string 然后匹配字符串?

最佳答案

我们利用了 Seq.filterSeq.map 可以被插入 Seq.collect 而不会改变结果的事实。在这种情况下,l 仍然可以访问。

最后一个filter 函数更适合与type test operator 一起使用:?.

let GetAllDirectAssignmentsforLists(spWeb: SPWeb) =    
spWeb.Lists
|> Seq.cast<SPList>
|> Seq.filter (fun l -> l.HasUniqueRoleAssignments)
|> Seq.collect (fun l -> l.RoleAssignments
|> Seq.cast<SPRoleAssignment>
|> Seq.map (fun ra -> ra.Member)
|> Seq.filter (fun p -> match box p with
| :? SPUser -> true
| _ -> false)
|> Seq.map (fun m -> l.Title, m.LoginName.ToLower()))

为了进一步简化,您可以将 Seq.mapSeq.filter 系列更改为 Seq.choose :

Seq.choose (fun ra -> match box ra.Member with
| :? SPUser -> Some (l.Title, ra.Member.LoginName.ToLower())
| _ -> None)

关于F# 管道从上面的管道阶段访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12597909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com