我想合并域中所有域控制器的数据。
例如,我总结所有 logonCount ,我只选择最新的 lastLogon 。这是在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²)(对吧?)。
有没有办法让算法更有效?
提前致谢。
答案 0 :(得分:0)
这不是 O(n ^ 2)。它是 O(n ^ 3),因为您迭代域,在其中迭代域控制器,在其中迭代用户。如果你想优化它,那么首先,你应该看一下EnumerateAllUsersInDomainController(domainControllerDirectoryEntry)
的调用。如果你有一个EnumerateAllUsersInDomainControllers
的方法可以期待DirectoryEntry
的列表,那会好得多吗?如果你有这样的方法,那么优化将包含以下元素:
this.Domains
并将domain.DomainControllers
与包含域控制器的列表合并EnumerateAllUsersInDomainControllers