web-dev-qa-db-fra.com

ToList () .Pour chaque en Linq

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))
48
manav inder

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 ...

64
xanatos

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.

17
Charles Graham
employees.ToList().ForEach(
     emp=>
     {
          collection.AddRange(emp.Departments);
          emp.Departments.ToList().ForEach(u=>u.SomeProperty = null);
     });
11
artwl

Essaye ça:

foreach (var dept in employees.SelectMany(e => e.Departments))
{
   dept.SomeProperty = null;
   collection.Add(dept);
}
3
Ilian
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.

2
Saurabh