2010-01-28 3 views
3

Ok, donc je fais une itération d'une collection. pour chaque membre qui répond à certains critères, je veux appeler une méthode sur cet élément:Une autre question de traduction Linq

Voici comment je fais maintenant:

 

foreach(MyObject obj in myCollection) 
{ 
    if(obj.Property == theSearchValue) 
    obj.DoIt(); 
} 
 

Pour ce que ça vaut, je pense que le foreach est le La manière la plus lisible et la plus claire de le faire (nous pourrions parler de points précis sur les accolades), c'est donc plus une question académique/d'apprentissage pour moi.

La question: Quelle est la meilleure façon d'exprimer cela avec Linq? Existe-t-il une façon Linqy de faire cela plus claire/lisible/maintenable que ma boucle foreach? Si oui, le fait-il sans sacrifier la performance?

(Beaucoup des opérations linq que je vois semblent soignées et toutes, mais elles aboutissent souvent à la création d'énumération intermédiaires, ou énumérant parfois une collection plusieurs fois - ma petite foreach résout le problème en 1 passe, sans collections temporaires créées.)

+1

Aucune collection temporaires sont créés avec la version LINQ montre Justin. C'est un passage, tout comme le tien. Choisissez celui que vous aimez. –

Répondre

2
foreach (MyObject obj in 
        myCollection.Where(item => item.Property == theSearchValue)) 
    obj.DoIt(); 
+0

J'aime la clarté de celui-ci. Mais savez-vous si l'extension "where" est l'une des extensions qui s'exécute tout à la fois, ou si c'est un rendement? (ex: est-ce que le code exécute 2 boucles ou 1 boucle?) – JMarsch

+0

@JMarsch, Tout va bien, seulement 1 boucle. Aller à l'IL pour la preuve – AndreyAkinshin

+0

J'aime vraiment ta réponse et Justin je pensais que la tienne était la plus lisible, donc j'ai marqué la tienne comme réponse. Merci les gars pour votre aide! – JMarsch

5

vous ne gagnerez pas beaucoup d'utiliser LINQ ...

var matches = myCollection.Where(i => i.Property == theSearchValue); 

foreach(var item in matches) 
    item.DoIt(); 

vous pouvez également utiliser des méthodes d'extension pour ajouter une méthode Each() pour cacher la boucle (mais vous ne gagnerez pas Efficacité). Le code résultant ressemblerait à ceci:

myCollection.Where(i => i.Property == theSearchValue).Each(i => i.DoIt());