ToList().ForEach dans Linq
Je suis Linq.
Je veux mettre deux valeurs dans l'instruction foreach comme ce
Mon code est ce
foreach (Employee emp in employees)
{
foreach(Department dept in emp.Departments)
{
dept.SomeProperty = null;
}
collection.AddRange(emp.Departments);
}
Peu de refactoring tourne le ci-dessus dans cette
foreach (Employee emp in employees)
{
emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
collection.AddRange(emp.Departments);
}
Mais je veux quelque chose comme ce
employees.ToList().Foreach(collection.AddRange(emp.Departments),
emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
- NON! Ne pas convertir votre collection de la liste vient d'appeler cette méthode... Utiliser vos boucles.
- Réfléchir sur la performance, tandis que l'évolution de Linq. Pas toujours LINQ est utile par rapport à la normale des boucles.
- Le faire et personne ne peut lire votre code à nouveau. L'autonomie de l'obscurcissement.
- Le code d'origine est parfaitement clair et compréhensible; je ne vois pas le besoin de le changer. Rappelez-vous, le code n'est pas seulement pour communiquer au compilateur de communiquer au futur lecteur de code; la rendre aussi claire que possible.
- Merci Eric. Si je n'avais pas été habitué à la LECTURE de tous les commentaires maintenant j'aurais manqué cette importante recommandation.
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas utiliser
ForEach
de cette façon. Lire Lippert est “foreach” vs “ForEach”Si vous voulez être cruel avec vous-même (et le monde), à moins de ne pas créer d'inutiles
List
À noter que le résultat de la
All
expression est unbool
valeur que nous rejetons (nous l'utilisons seulement parce qu'il "cycles" de tous les éléments)Je vais répéter. Vous ne devriez pas utiliser
ForEach
à modifier les objets. LINQ doivent être utilisés dans un "fonctionnelle" façon (vous pouvez créer de nouveaux objets, mais vous ne pouvez pas modifier des objets anciens, ni vous pouvez créer des effets secondaires). Et ce que vous écrivez est en créant ainsi de nombreux inutileList
seulement pour gagner deux lignes de code...ToList()
abus avec unAll
abus. 😉Que xanatos a dit, c'est une mauvaise utilisation de ForEach.
Si vous allez utiliser linq pour gérer cela, je voudrais faire comme ceci:
Cependant, la Boucle approche est plus lisible et donc plus facile à gérer.
SelectMany
(non pas que je voudrais l'utiliser 🙂 )AddRange
de ligne qui n'est inutile supplémentaire de la traversée de la séquence. On peut fairecollection.Add(item)
à l'intérieur de la boucle existante avec le même résultat.Essayez ceci:
Remarquez que j'ai utilisé des points-virgules après chaque instruction set
qu'est -->
J'espère que cela va certainement résoudre votre problème.
tu veux?
Essayez avec cette combinaison d'expressions Lambda: