J'essaye d'écrire un utilitaire pour voir si un utilisateur s'est connecté à Windows depuis une date que j'ai stockée dans une base de données.Recherche rapide des résultats dans un objet Enumerable
private void bwFindDates_DoWork(object sender, DoWorkEventArgs e)
{
UserPrincipal u = new UserPrincipal(context);
u.SamAccountName = "WebLogin*";
PrincipalSearcher ps = new PrincipalSearcher(u);
var result = ps.FindAll();
foreach (WebAccess.WebLoginUsersRow usr in webAccess.WebLoginUsers)
{
UserPrincipal b = (UserPrincipal)result.
Single((a) => a.SamAccountName == usr.WEBUSER);
if (b.LastLogon.HasValue)
{
if (b.LastLogon.Value < usr.MODIFYDATE)
usr.LastLogin = "Never";
else
usr.LastLogin = b.LastLogon.Value.ToShortDateString();
}
else
{
usr.LastLogin = "Never";
}
}
}
Cependant, les performances sont très lentes. La liste d'utilisateurs que je tire a environ 150 utilisateurs de Windows, donc quand je tape la ligne UserPrincipal b = (UserPrincipal)result.Single((a) => a.SamAccountName == usr.CONVUSER);
il faut 10 à 15 secondes pour qu'il se termine par utilisateur (en passant par je peux voir qu'il fait l'étape a.SamAccountName == usr.CONVUSE
est exécuté pour chaque personne si le pire des cas est O (n^2) fois)
Des recommandations sur les façons d'améliorer mon efficacité?
Je déteste la façon dont SO aime parfois traiter les onglets dans une section de code et parfois non. –