首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Foreach循环(包含LINQ)性能提升

Foreach循环(包含LINQ)性能提升
EN

Stack Overflow用户
提问于 2013-04-26 00:14:59
回答 2查看 786关注 0票数 0

我希望简化包含foreach循环的以下代码,以最小化迭代和/或提高性能,因为在每次迭代中都会创建LINQ和集合:

代码语言:javascript
复制
foreach (Contact contact in Contacts) // phone contacts, around 500-1000
{
    IEnumerable<ContactEmailAddress> emails = contact.EmailAddresses; // each has multiple emails

    foreach (Friend parseUser in parseUsers) // could be many thousands
    {
        if (emails.Where(e => e.EmailAddress == parseUser.Email).ToList().Count > 0)
        {                        
            parseUser.AddContact(contact); // function call

            verifiedUsers.Add(parseUser); // add to my new aggregated list
        }
    }
}

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-26 00:21:24

您可以使用搜索效率更高的集合,例如HashSet,而不是对parseUsers中的每一项对emails集合进行线性搜索

代码语言:javascript
复制
foreach (Contact contact in Contacts) // phone contacts, around 500-1000
{
    HashSet<string> emails = new HashSet<string>(
        contact.EmailAddresses.Select(e => e.EmailAddress));

    foreach (Friend parseUser in parseUsers) // could be many thousands
    {
        if(emails.Contains(parseUser.Email))
        {
            parseUser.AddContact(contact); // function call

            verifiedUsers.Add(parseUser); // add to my new aggregated list
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-04-26 00:48:26

不会提高性能,但可以提高可读性:

代码语言:javascript
复制
foreach (Friend parseUser in parseUsers) // could be many thousands
{
    var filterContacts = Contacts.Where(contact =>
                              contact.EmailAddresses.Contains(parseUser.Email));
    if (filterContact.Any())
    {
        parseUser.AddContacts(filterContacts);
        verifiedUsers.Add(parseUser);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16219818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档