Sharepoint 使用.NET自定义集合对象时如何编写函数代码

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

我正在尝试用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.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)