高效合并来自所有域控制器的数据

本文关键字:域控 控制器 数据 合并 高效 | 更新日期: 2023-09-27 18:31:50

我想合并域中所有域控制器的数据。

例如,我对所有登录计数求和,并且只选择最新的最后登录。这是在private static User MergeData(User alreadyKnownUser, User newlyRetrieveUser)方法中完成的。

这是我的代码:

foreach (Domain domain in this.Domains)
{
    ConcurrentDictionary<string, User> usersFromCurrentDomain = new ConcurrentDictionary<string, User>();
    foreach (ActiveDirectoryDomainController domainController in domain.DomainControllers)
    {
        DirectoryEntry domainControllerDirectoryEntry = domainController.DirectoryEntry;
        ICollection<User> userFromCurrentDomainController = EnumerateAllUsersInDomainController(domainControllerDirectoryEntry);
        Parallel.ForEach(userFromCurrentDomainController, currentUser =>
        {
            string userId = currentUser.Id;
            if(usersFromCurrentDomain.Contains(userId))
            {
                User retrievedUser = usersFromCurrentDomain[userId];
                retrievedUser = MergeData(retrievedUser, currentUser);
                usersFromCurrentDomain[id] = retrievedUser;
            }
            else
            {
                usersFromCurrentDomain.Add(userId, currentUser);
            }
        });
    }
}

我认为它的效率是O(n²)(对吧?

没有办法有更有效的算法?

提前谢谢。

高效合并来自所有域控制器的数据

这不是

O(n^2)。它是 O(n^3),因为您迭代域,在其中迭代域控制器,在其中迭代用户。如果你想优化这一点,那么首先,你应该看看 EnumerateAllUsersInDomainController(domainControllerDirectoryEntry)的召唤 .如果你有一种EnumerateAllUsersInDomainControllers的方法,可以期待一个DirectoryEntry列表,那不是更好吗?如果您有这样的方法,则优化将包含以下元素:

  • 迭代this.Domains并将domain.DomainControllers与包含域控制器的列表合并
  • 在单独的迭代中迭代域控制器,构建目录条目列表
  • 调用新创建的EnumerateAllUsersInDomainControllers
  • 您可以根据需要解析结果