2013-04-25 77 views
0

我希望简化以下代码包含foreach循环以最小化的迭代和/或增加,因为LINQ和集合的性能在每次迭代被创建: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

'如果(emails.Any(E => e.EmailAddress == parseUser.Email))' – Romoku 2013-04-25 16:20:32

+0

开始'.ToList()计数>由'。任何0'() ' – ken2k 2013-04-25 16:20:39

+0

@Romoku&肯,而那无线肯定会有所帮助,因为它增加了短路,你可以通过完全避免嵌套循环内部的线性搜索来做得更好。 – Servy 2013-04-25 16:22:27

回答

3

,而不是做对emails集合在parseUsers每一个项目,你可以使用一个集合的线性搜索,可以更加高效地搜索,如HashSet

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

感谢您的建议,我不得不使用字典创建自己的HashSet,因为不幸的是WP7不支持HashSet。 – PmanAce 2013-04-25 16:26:36

1

没有多大改善性能,但提高readbility:通过替换

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