2013-05-01 49 views
0

我從活動目錄獲取用戶和組,但經過一些測試後,我們發現memberOF未與member對齊示例userA是groupW的成員,但groupW未列出userA作爲成員。爲了解決這個問題,我們必須讓會員及會員然後同步他們。查找2的三角洲IEnumerable <T>

public class User 
    { 
     public string UserName { get; set; } 
     public IList<string> MemberOf { get; set; } // list of group names 
    } 

public class Group 
{ 
    public string Name { get; set; } 
    public IList<string> Members { get; set; } // list of username 
} 

從Active Directory中我得到

IEnumerable<Group> allGroups 
IEnumerable<User> allUsers 

我怎樣才能獲得增量?

我應該有2本字典或查找...等

  1. allGroups 列表User.MemberOF 未發現各組字典應具備的關鍵,因爲用戶的組名和值列表。

例如組A的用戶{A,B,C},組B的用戶{A,C}

  1. ALLUSERS 列表中的所有的用戶不Group.member 詞典中找到應具有鍵作爲用戶名和組的值列表。

例如用戶A組{X,Y},用戶B組{X,Z}

編輯:又如:讓我們說,這是第2 IEnumerable的從Active Directory返回。

`IEnumerable<Group> allGroups` contains 
- GroupA {"Mike","Jan","David"} 
- GroupB {"Kim","David","Jolan","Tim"} 

    // where Groupx is the name of the group and between {""} is the list of member 

    IEnumerable<User> allUsers contains 

- Mike {"GroupA","GroupB","GroupC"} 
- David {"GroupA","GroupB"} 
- Jolan {"GroupB","GroupC"} 

在這個例子中,我們可以看到,當我們要求LDAP獲得groupA的所有成員時,「Jolan」未被列出。但是,當我們要求得到所有羣體,其中「Jolan」是成員,那麼我們可以看到,「A組」中列出。同樣的,「邁克」,他是B族中的一員,也C組。 GroupC未列出。 「大衛」 在這種情況下,有正確的價值觀。

還要注意的是,「提姆」,在B組上市之後,雖然他不是在allUsers

結果應該是這樣的

Dictionary<string,IList<string>> missingUsers; 
Item 1 > key="Mike", Value={"GroupB","GroupC"} 
Item 2 > Key="Jolan" , Value= {"GroupC"} 

Dictionary<string,IList<string>> missingGroup; 
item 1 > Key="GroupB",{"Tim"} 

我希望這是更清晰

+0

在您的第一個示例中,您是否嘗試在groupA中查找** not **的用戶列表? IE瀏覽器。 A,B和C在組A中不是**,但所有其他用戶**在組A中都是**? – Kevin 2013-05-01 22:38:08

+0

好吧,我將編輯帖子,並嘗試使其更清楚。 – Maro 2013-05-01 23:35:15

+0

我明白了...我並不期望LDAP會給出不一致的結果,所以這就是我沒有想到的原因。易於修復...我會更新我的答案。 – Kevin 2013-05-02 15:41:26

回答

1

我不能完全肯定,如果這是你的要求或不是...我會根據你的迴應我的評論明天改變我的答案。 :)

假設你想團與誰該組中沒有用戶列表的字典,以及用戶與組列表的字典他們不是那麼這裏就是它的代碼...

var groupsWithUsersNotInThem = new Dictionary<Group, List<User>>(); 
    var usersWithGroupsTheyArentIn = new Dictionary<User, List<Group>>(); 
    allUsers.ForEach(u => 
     { 
      var groupsThisUserIsntIn = groups.Where(g => !g.Members.Contains(u.UserName)).ToList(); 
      if (groupsThisUserIsntIn.Count() > 0) 
       usersWithGroupsTheyArentIn.Add(u, groupsThisUserIsntIn); 
     }); 
    allGroups.ForEach(g => 
    { 
     var usersNotInThisGroup = users.Where(u => !u.MemberOf.Contains(g.Name)).ToList(); 
     if (usersNotInThisGroup.Count() > 0) 
      groupsWithUsersNotInThem.Add(g, usersNotInThisGroup); 
    }); 

編輯:讓上面的代碼的情況下,這是非常有用的

這是新的代碼,解決實際問題三角洲...只找到用戶/組,其中另一個列表不匹配。

var missingGroups = new Dictionary<String, List<String>>(); 
    var missingUsers = new Dictionary<String, List<String>>(); 
    allUsers.ForEach(u => 
    { 
     // get the list where the group exists but this user isn't in it 
     var groupsThisUserIsntIn = allGroups 
      .Where(g => u.MemberOf.Contains(g.Name) && !g.Members.Contains(u.UserName)) 
      .Select(g => g.Name).ToList(); 
     // add in the groups this user says he belongs to but that aren't in allGroups 
     groupsThisUserIsntIn.AddRange(u.MemberOf.Where(userGroupName => allGroups.All(g => g.Name != userGroupName))); 
     if (groupsThisUserIsntIn.Count() > 0) 
      missingUsers.Add(u.UserName, groupsThisUserIsntIn); 
    }); 
    allGroups.ForEach(g => 
    { 
     // get the list where the user exists but this group isn't in it 
     var usersNotInThisGroup = allUsers 
      .Where(u => g.Members.Contains(u.UserName) && !u.MemberOf.Contains(g.Name)) 
      .Select(u => u.UserName).ToList(); 
     // add in the users this group says it has but that aren't in allUsers 
     usersNotInThisGroup.AddRange(g.Members.Where(groupUserName => allUsers.All(u => u.UserName != groupUserName))); 
     if (usersNotInThisGroup.Count() > 0) 
      missingGroups.Add(g.Name, usersNotInThisGroup); 
    }); 
+0

謝謝凱文,不過看起來我沒有明確解釋它 但是,您的解決方案幫助我解決了另一個問題,謝謝。 – Maro 2013-05-02 13:26:00