Je suis nouveau à Linq.
Je veux définir deux valeurs dans la déclaration foreach comme celle-ci
Mon code actuel est ceci
foreach (Employee emp in employees)
{
foreach(Department dept in emp.Departments)
{
dept.SomeProperty = null;
}
collection.AddRange(emp.Departments);
}
Un peu de refactoring transforme ce qui précède en cette
foreach (Employee emp in employees)
{
emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
collection.AddRange(emp.Departments);
}
Mais je veux quelque chose comme ça
employees.ToList().Foreach(collection.AddRange(emp.Departments),
emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
Vous ne devriez pas utiliser ForEach
de cette façon. Lire le texte de Lippert “foreach” vs “ForEach”
Si vous voulez être cruel avec vous-même (et le monde), au moins, ne créez pas d'inutile List
employees.All(p => {
collection.AddRange(p.Departments);
p.Departments.All(u => { u.SomeProperty = null; return true; } );
return true;
});
Notez que le résultat de l'expression All
est une valeur bool
que nous ignorons (nous ne l'utilisons que parce qu'il "cycle" tous les éléments)
Je vais répéter. Vous ne devriez pas utiliser ForEach
pour changer les objets. LINQ doit être utilisé de manière "fonctionnelle" (vous pouvez créer de nouveaux objets mais vous ne pouvez pas changer d’anciens objets ni créer d’effets secondaires). Et ce que vous écrivez, c'est créer tant d’inutiles List
seulement pour gagner deux lignes de code ...
Comme xanatos l’a dit, c’est un mauvais usage de ForEach.
Si vous allez utiliser linq pour gérer cela, je le ferais comme ceci:
var departments = employees.SelectMany(x => x.Departments);
foreach (var item in departments)
{
item.SomeProperty = null;
}
collection.AddRange(departments);
Cependant, l’approche en boucle est plus lisible et donc plus facile à maintenir.
employees.ToList().ForEach(
emp=>
{
collection.AddRange(emp.Departments);
emp.Departments.ToList().ForEach(u=>u.SomeProperty = null);
});
Essaye ça:
foreach (var dept in employees.SelectMany(e => e.Departments))
{
dept.SomeProperty = null;
collection.Add(dept);
}
employees.ToList().Foreach(u=> { u.SomeProperty = null; u.OtherProperty = null; });
Notez que j'ai utilisé des points-virgules après chaque instruction set qui est ->
u.SomeProperty = null;
u.OtherProperty = null;
J'espère que cela résoudra définitivement votre problème.