it-swarm-id.com

ToList (). ForEach di Linq

Saya baru mengenal Linq.

Saya ingin menetapkan dua nilai dalam pernyataan foreach seperti ini

Kode aktual saya adalah ini

foreach (Employee emp in employees)
{
    foreach(Department dept in emp.Departments)
    {
        dept.SomeProperty = null;
    }
    collection.AddRange(emp.Departments);              
}

Sedikit refactoring mengubah ini menjadi ini

foreach (Employee emp in employees)
{
    emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
    collection.AddRange(emp.Departments);              
}

Tetapi saya menginginkan sesuatu seperti ini

employees.ToList().Foreach(collection.AddRange(emp.Departments),
emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
48
manav inder

Anda seharusnya tidak menggunakan ForEach dengan cara itu. Baca Lippert “foreach” vs “ForEach”

Jika Anda ingin menjadi kejam dengan diri Anda sendiri (dan dunia), setidaknya jangan membuat List tidak berguna

employees.All(p => {
    collection.AddRange(p.Departments);
    p.Departments.All(u => { u.SomeProperty = null; return true; } );
    return true;
});

Perhatikan bahwa hasil dari ekspresi All adalah nilai bool yang kami buang (kami menggunakannya hanya karena "siklus" semua elemen)

Saya ulangi. Anda seharusnya tidak menggunakan ForEach untuk mengubah objek. LINQ harus digunakan dengan cara "fungsional" (Anda dapat membuat objek baru tetapi Anda tidak dapat mengubah objek lama atau Anda dapat membuat efek samping). Dan apa yang Anda tulis adalah menciptakan begitu banyak List yang tidak berguna hanya untuk mendapatkan dua baris kode ...

64
xanatos

Seperti yang dikatakan xanatos, ini adalah penyalahgunaan ForEach.

Jika Anda akan menggunakan LINQ untuk menangani ini, saya akan melakukannya seperti ini:

var departments = employees.SelectMany(x => x.Departments);
foreach (var item in departments)
{
    item.SomeProperty = null;
}
collection.AddRange(departments);

Namun, pendekatan Loop lebih mudah dibaca dan karena itu lebih dapat dipertahankan.

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

Coba ini:

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; });

Perhatikan bahwa saya menggunakan titik koma setelah setiap pernyataan set yaitu ->

u.SomeProperty = null;
u.OtherProperty = null;

Saya harap ini pasti akan menyelesaikan masalah Anda.

2
Saurabh