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

时间:2013-04-25 16:14:59

标签: c# windows-phone-7 loops

我希望简化以下包含foreach循环的代码,以最大限度地减少迭代和/或提高性能,因为LINQ和集合是在每次迭代时创建的:

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

感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用可以更有效搜索的集合,例如emailsparseUsers中每个项目的HashSet集合进行线性搜索p>

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

答案 1 :(得分:1)

没有提高性能,但提高了可读性:

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