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

C# 高效地合并来自所有域控制器的数据,c#,active-directory,C#,Active Directory,我想合并域中所有域控制器的数据 例如,我对所有logonCounts求和,只选择最新的lastLogon。这是在私有静态用户MergeData(用户alreadyknowuser,用户newlyRetrieveUser)方法中完成的 这是我的密码: foreach (Domain domain in this.Domains) { ConcurrentDictionary<string, User> usersFromCurrentDomain = new Concurren

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

例如,我对所有logonCounts求和,只选择最新的lastLogon。这是在
私有静态用户MergeData(用户alreadyknowuser,用户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);
            }
        });
    }
}
foreach(此.Domains中的域)
{
ConcurrentDictionary usersFromCurrentDomain=新建ConcurrentDictionary();
foreach(域中的ActiveDirectoryDomainController domainController.domainController)
{
DirectoryEntry domainControllerDirectoryEntry=domainController.DirectoryEntry;
ICollection userFromCurrentDomainController=EnumerateAllUsersInDomainController(domainControllerDirectoryEntry);
Parallel.ForEach(userFromCurrentDomainController,currentUser=>
{
字符串userId=currentUser.Id;
if(usersFromCurrentDomain.Contains(userId))
{
用户检索User=usersFromCurrentDomain[userId];
retrievedUser=合并数据(retrievedUser,currentUser);
usersFromCurrentDomain[id]=retrievedUser;
}
其他的
{
usersFromCurrentDomain.Add(userId,currentUser);
}
});
}
}
我认为它的效率是O(n²)(对吗?)

有没有什么方法可以得到更有效的算法

提前谢谢。

这不是O(n^2)。它是O(n^3),因为您迭代域,在域内部您迭代域控制器,在域控制器内部您迭代用户。如果您想对此进行优化,那么首先,您应该查看调用
EnumerateAllUsersInDomainController(domainControllerDirectoryEntry)
。如果您有一个
EnumerateAllusInDomainController
方法,该方法将需要一个
目录条目的列表,不是更好吗?如果您有这样的方法,那么优化将包含以下元素:

  • 您迭代
    this.Domains
    并将
    domain.DomainControllers
    与包含域控制器的列表合并
  • 您可以在单独的迭代中迭代域控制器,生成DirectoryEntry列表
  • 您可以调用新创建的
    EnumerateAllusInDomainController
  • 您可以根据需要分析结果