嵌套的foreach循环缓慢

Tri*_*hen 1 c# optimization foreach

以下代码可以获得所需的结果,但性能非常慢:

SearchResultCollection absaUsers = ABSAds.FindAll();
SearchResultCollection srcUsers = ds.FindAll();

foreach (SearchResult users in srcUsers)
{
    string cn = users.Properties["cn"][0].ToString();
    string sn = users.Properties["sn"][0].ToString();
    string userID = users.Properties["uid"][0].ToString();
    string description = users.Properties["PersonnelAreaDesc"][0].ToString();
    string jobCodeID = users.Properties["JobcodeID"][0].ToString();
    string CostCentreID = users.Properties["costCentreID"][0].ToString();
    string CostCentreDescription = users.Properties["CostCentreDescription"][0].ToString();
    string givenName = users.Properties["givenName"][0].ToString();
    string employmentStatus = users.Properties["EmploymentStatus"][0].ToString();
    string EmploymentStatusDescription = users.Properties["EmploymentStatusDescription"][0].ToString();

    foreach (SearchResult absaUser in absaUsers)
    {

        string absaUID = absaUser.Properties["uid"][0].ToString();
        string absaEmploymentStatus = absaUser.Properties["EmploymentStatus"][0].ToString();
        string absaEmploymentStatusDescription = absaUser.Properties["EmploymentStatusDescription"][0].ToString();
        string absaEmployeeNumber = absaUser.Properties["employeeNumber"][0].ToString();

        if (absaUID == cn && absaEmployeeNumber==userID)
        {
            Console.WriteLine("User Record Found:" + cn);
            sw.WriteLine("Modify" + "," + cn + "," + description + "," + userID + "," + givenName + "," + sn + "," + jobCodeID + "," + CostCentreID + "," + CostCentreDescription + "," + sn + "," + cn + "," + employmentStatus + "," + EmploymentStatusDescription);
            sw.Flush();
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它遍历2个集合,并使用内部的mtach外部循环属性.关于如何优化性能的任何建议?

Jon*_*eet 6

如果首先将所有absaUID值提取到查找中会更快:

var lookup = absaUsers.Cast<SearchResult>()
                      .ToLookup(x => x.Properties["uid"][0].ToString());
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

foreach (SearchResult users in srcUsers)
{
    string cn = users.Properties["cn"][0].ToString();
    foreach (SearchResult matches in lookup[cn])
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

您还没有显示如何absaUsers定义 - 如果它是LINQ查询表达式,那么可能是您现有的代码将在每次迭代时转到数据库 - 而上述情况则不然.在另一方面,如果srcUsers也是一个LINQ查询表达式与一个数据库,你应该考虑使用,而不是加入做的所有匹配的数据库.