C# 嵌套foreach循环慢

C# 嵌套foreach循环慢,c#,optimization,foreach,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.Properti

以下代码实现了预期的结果,但性能非常慢:

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;
        }
    }
}

它循环2个集合,并将外部循环属性与内部循环属性进行mtaches。有没有关于如何优化性能的建议

如果先将所有
absaUID
值提取到查找中,则速度会更快:

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

您还没有展示如何定义
absaUsers
——如果它是一个LINQ查询表达式,那么可能是您现有的代码在每次迭代时都会进入数据库,而上面的情况则不会。另一方面,如果<代码> SrcSuths/Cuth>也是一个与数据库对话的LINQ查询表达式,您应该考虑使用Soin代替在数据库中执行所有匹配。

< P>如果将所有的<代码> ABSAID 值先查找:

会更快。
var lookup = absaUsers.Cast<SearchResult>()
                      .ToLookup(x => x.Properties["uid"][0].ToString());

您还没有展示如何定义
absaUsers
——如果它是一个LINQ查询表达式,那么可能是您现有的代码在每次迭代时都会进入数据库,而上面的情况则不会。另一方面,如果<代码> SrcSuths/Cuth>也是一个与数据库对话的LINQ查询表达式,你应该考虑使用一个连接来代替数据库中的所有匹配。

< P>你可以使用LINQUIN,一些例子是,我假设是谁把它建成.NET找到了一个非常理想的方法,然后循环。旁注:你的收藏类型是什么?请将它们的声明添加到代码段中。

您可以使用LINQ join,一些示例是,我假设将它构建到.NET中的人找到了一种非常理想的方法,然后循环使用它。旁注:你的收藏类型是什么?请将其声明添加到代码段。

使用Lamda表达式:

下面是一个示例,您可以选择将其升级到另一个级别

    List<SearchResult> allResultGroups=new  List<SearchResult>();
    foreach (SearchResult absaUser in absaUsers)
    {
    resultGroups = srcUsers.Where(g => g.cn == absaUser.absaUID && absaUser.absaEmployeeNumber==g.userID ).ToList();
    }
List allResultGroups=new List();
foreach(absaUser中的搜索结果absaUser)
{
resultGroups=srcUsers.Where(g=>g.cn==absaUser.absaUID&&absaUser.absaEmployeeNumber==g.userID.ToList();
}
使用Lamda表达式:

下面是一个示例,您可以选择将其升级到另一个级别

    List<SearchResult> allResultGroups=new  List<SearchResult>();
    foreach (SearchResult absaUser in absaUsers)
    {
    resultGroups = srcUsers.Where(g => g.cn == absaUser.absaUID && absaUser.absaEmployeeNumber==g.userID ).ToList();
    }
List allResultGroups=new List();
foreach(absaUser中的搜索结果absaUser)
{
resultGroups=srcUsers.Where(g=>g.cn==absaUser.absaUID&&absaUser.absaEmployeeNumber==g.userID.ToList();
}

有关于性能度量的统计信息吗?列表中有多少项
absaUsers
srcUsers
?如果这些都来自数据库,那么最好在SQL级别执行,并加入表,只获取所需的数据。抱歉,没有说得太具体。该程序连接2个不同的LDAP存储,并比较用户属性。Absauser包含大约50000个用户,Scruser包含大约11000个关于性能度量的统计数据?列表中有多少项
absaUsers
srcUsers
?如果这些都来自数据库,那么最好在SQL级别执行,并加入表,只获取所需的数据。抱歉,没有说得太具体。该程序连接2个不同的LDAP存储,并比较用户属性。Absauser包含大约50000个用户,Scruser包含大约11个用户000@Trishen:您可能需要调用
Cast
-将添加该选项。@Trishen:您可能需要调用
Cast
-将添加该选项。