2010-08-10 3 views
3

J'ai actuellement une méthode qui boucle dans une liste d'objets métier (propriété Propriétés) pour tester si la propriété SerialNumber est un numéro de série ou non. Si je trouve un numéro de série, je quitte la boucle et renvoie true, sinon je renvoie false.approche LINQ à ce code

code

est la suivante:

public bool HasSerialNumber() 
    { 
     if (this.Properties != null && this.Properties.Count > 0) 
     { 
      foreach (var property in Properties) 
      { 
       if (!string.IsNullOrEmpty(property.SerialNumber)) 
        return true; 
      } 
     } 
     return false; 
    } 

Y at-il une meilleure approche LINQ à cela?

Je donne les résultats suivants à l'esprit:

return Properties.Where(x => !string.IsNullOrEmpty(x.SerialNumber)).ToList().Count > 0; 

Y at-il une meilleure/méthode plus rapide pour le contrôle de chaîne non vide?

+0

Même avec votre exemple, vous pouvez utiliser '.Count()' au lieu de '.ToList(). Count' pour accélérer les choses un peu.' Any() 'est le chemin à parcourir. –

+0

@callum Il m'a donné une erreur de compilation quand j'avais juste .Count() alors j'ai dû appeler ToList(). Sauf si je l'appelais mal ... – mint

+0

@snow: Etrange, ça devrait marcher. Au moins cela fait: 'var strs = new [] {" "," lol ", null}; Console.WriteLine (strs.Where (s => string.IsNullOrEmpty (s)). Count()); ' –

Répondre

12

Vous pouvez utiliser Any au lieu de vérifier si le nombre est supérieur à zéro.

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)) 

et bien sûr votre Properties.Count > 0 vérification est redondant.

+4

+1. En plus de mieux communiquer votre intention, le bonus supplémentaire d'utiliser 'Any()' est que la liste sous-jacente ne sera répétée que si une propriété avec le numéro de série est trouvée. Si vous utilisez Count() ou ToList(), la liste complète doit être évaluée, de sorte que vous perdez des performances. Bien sûr, cela ne fera pas une grande différence dans ce cas, mais quand même. – jeroenh

3

Cela devrait faire l'affaire:

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)); 
9

Check out IEnumerable<T>.Any():

public bool HasSerialNumber() 
{ 
    if(this.Properties != null) 
     return Properties.Any(p => !string.IsNullOrEmpty(p.SerialNumer)); 
    return false; 
} 
6

Je ne pense pas que vous allez améliorer particulièrement sur les performances de string.IsNullOrEmpty(), mais un piège vous devriez être éviter est les 2 derniers appels sur votre requête - spécifiquement ToList() et Count(). Ce que vous faites ici, c'est de parcourir chaque élément, de le convertir en une liste (créer une liste et ajouter des éléments dans le processus, puis parcourir tous les éléments de la liste pour en compter le nombre - tout pour vérifier . si une seule valeur est vide

vous pouvez utiliser la méthode Any pour trouver si un seul élément correspond à certains critères, comme suit:

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)); 
Questions connexes