Sharepoint 使用.NET自定义集合对象时如何编写函数代码
我正在尝试用F处理SharePoint 2010对象,这与我的经验一样 所以我写了这个代码Sharepoint 使用.NET自定义集合对象时如何编写函数代码,sharepoint,f#,Sharepoint,F#,我正在尝试用F处理SharePoint 2010对象,这与我的经验一样 所以我写了这个代码 let getSPDomainUsers (spWeb : SPWeb) = seq { for r in spWeb.RoleAssignments do match r.Member with | :? SPUser as user -> for b in r.RoleDefinitionBindings do if (user.I
let getSPDomainUsers (spWeb : SPWeb) =
seq {
for r in spWeb.RoleAssignments do
match r.Member with
| :? SPUser as user ->
for b in r.RoleDefinitionBindings do
if (user.IsDomainGroup) then yield (spWeb.Url.ToLower(), user, b.Name.ToLower())
| :? SPGroup as group ->
for u in group.Users do
for b in r.RoleDefinitionBindings do
if (u.IsDomainGroup) then yield (spWeb.Url.ToLower(), u, b.Name.ToLower())
| _ -> ()
}
然而,对于所有这些for循环和if条件,我的代码看起来非常必要
我想做一些类似List.map的事情,而不是for循环,但是这些对象中的大多数
RoleDefinitionBindings或RoleAssignments返回的集合不是列表、数组或序列,因此我被迫编写循环
您能否告诉我,当返回类型为自定义集合对象(如SPRoleAssignmentCollection和SPRoleDefinitionBindingCollection)时,如何避免循环。继承实现IEnumerable但不实现IEnumerable的对象,即seq
一旦您有了一个seq继承,它实现了IEnumerable但不实现IEnumerable,即seq
一旦你拥有了一个绝对可爱的女孩!!!这个代码真的好多了。。。因为它绝对没有嵌套循环。绝对可爱!!!这个代码真的好多了。。。因为它绝对没有嵌套循环。
let userInfo (user : SPUser) =
user.RoleDefinitionBindings
|> Seq.cast<SPRoleDefinition>
|> Seq.choose (fun b ->
if user.IsDomainGroup then
Some (spWeb.Url.ToLower(), user, b.Name.ToLower())
else None)
let getSPDomainUsers (spWeb : SPWeb) =
spWeb.RoleAssignments
|> Seq.cast<SPRoleAssignment>
|> Seq.collect (fun r ->
match r.Member with
| :? SPUser as user ->
userInfo user
| :? SPGroup as group ->
Seq.collect userInfo group.Users
| _ ->
Seq.empty)