2010-11-24 31 views
3
List<string> ls = new List<string>(); 
Feed<Contact> f = cr.GetContacts(); 

     foreach (Contact e in f.Entries) 
      foreach (EMail el in e.Emails) 
       if (!(ls.Contains(el.Address.Substring(el.Address.LastIndexOf('@')+1)))) 
        ls.Add(el.Address.Substring(el.Address.LastIndexOf('@')+1)); 

Dans le code ci-dessus, j'essaye d'obtenir le domaine distinct de l'identification d'email, mais je les obtiens tous quel problème avec ma logique?domaines distincts dans Google Contacts

données de test:

InP:

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

... ces 20.000 entrées

je dois obtenir DISTINCT domaines

mais mon o/p est

gmail.com 
yahoo.com 
gmail.com 
gmail.com 
someOtherDomain.com 

fait, il devrait être:

gmail.com yahoo.com someOtherDomain.com

+1

En utilisant une liste c'est O (n^2), en utilisant un HashSet à la place c'est O (n). Mais je ne vois pas de bogue dans ce code. – CodesInChaos

+0

Testé votre code en utilisant un 'string []' comme entrée et cela a fonctionné correctement (en plus d'être sensible à la casse). – CodesInChaos

Répondre

1

Il est pas évident ce qui est en fait de mal, mais il est un moyen inefficace et laid de le faire. Je vous suggère d'essayer ceci:

var domains = (from contact in cr.GetContacts().Entries 
       from email in contact.Emails 
       let address = email.Address 
       select address.Substring(address.LastIndexOf('@') + 1)) 
       .Distinct(StringComparer.OrdinalIgnoreCase) 
       .ToList(); 

Cela dit, votre code original aurait vraiment dû fonctionner. Pourriez-vous fournir des données de test qui échouent?

+0

Les domaines sont insensibles à la casse, ceci est sensible à la casse. À moins que votre classe EMail canonique déjà cela. Et peut-être vérifier si EMail a une propriété pour la partie domaine. Par exemple 'MailAddress' a une propriété' Host' qui le fait. (Et non je ne suis pas le downvoter) – CodesInChaos

+0

@CodeInChaos: Edité pour le rendre insensible à la casse - bien que vu les données d'entrée, je ne pense pas que ce soit le problème. –