데이터베이스에 저장된 날짜 이후에 사용자가 Windows에 로그인했는지 확인하는 유틸리티를 작성하려고합니다.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";
}
}
}
그러나 성능이 매우 느립니다. 내가 당기는 사용자 목록은 약 150 명의 Windows 사용자가 있으므로 UserPrincipal b = (UserPrincipal)result.Single((a) => a.SamAccountName == usr.CONVUSER);
은 사용자 당 완료하는 데 10-15 초가 걸립니다. (단계별로 진행되는 것을 볼 수 있습니다.) a.SamAccountName == usr.CONVUSE
은 모든 사람을 위해 실행됩니다. 최악의 경우는 O (n^2) 회 실행 중임
효율성을 향상시키는 방법에 대한 권장 사항은 무엇입니까?
코드 섹션에서 탭을 처리하는 데 때때로 somtimes가 좋아하는 것을 싫어합니다. –