Apakah ada cara untuk melakukan hal berikut ini menggunakan LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Untuk memperjelas, saya ingin mengulangi setiap objek dalam koleksi dan kemudian memperbarui properti pada setiap objek.
Kasus penggunaan saya adalah saya memiliki banyak komentar pada posting blog, dan saya ingin mengulangi setiap komentar pada posting blog dan mengatur datetime pada posting blog menjadi 10 jam. Saya bisa melakukannya dalam SQL, tetapi saya ingin menyimpannya di lapisan bisnis.
Jawaban:
Meskipun Anda dapat menggunakan
ForEach
metode ekstensi, jika Anda ingin menggunakan hanya kerangka yang bisa Anda lakukanThe
ToList
diperlukan dalam rangka untuk mengevaluasi memilih segera karena malas evaluasi .sumber
ObservableCollection
ucapan, maka mengubah item yang ada daripada membuat daftar baru bisa bermanfaat.sumber
collection.ToList().ForEach(c => { c.Property1ToSet = value1; c.Property2ToSet = value2; });
collection.ToList().ForEach(c => { collection[collection.IndexOf(c)] = new <struct type>() { <propertyToSet> = value, <propertyToRetain> = c.Property2Retain }; });
Saya melakukan ini
sumber
All()
metode ekstensi, yang menyebabkan potensi kebingungan ketika orang lain membaca kode.List<>
itu,ForEach()
metode ini adalah cara yang jauh lebih samar untuk melakukannya. exForEach(c => { c.needsChange = value; })
Saya benar-benar menemukan metode ekstensi yang akan melakukan apa yang saya inginkan dengan baik
sumber
foreach
-loop (untuk alasan apa pun).foreach
karena kode itu sendiri mengandungforeach
loopMenggunakan:
Saya tidak yakin apakah ini menggunakan LINQ secara berlebihan atau tidak, tetapi ini berhasil bagi saya ketika ingin memperbarui item tertentu dalam daftar untuk kondisi tertentu.
sumber
Tidak ada metode ekstensi bawaan untuk melakukan ini. Meskipun mendefinisikan satu cukup lurus ke depan. Di bagian bawah posting adalah metode yang saya definisikan disebut Iterate. Itu bisa digunakan seperti itu
Sumber Iterate
sumber
Meskipun Anda secara khusus meminta solusi LINQ dan pertanyaan ini sudah cukup lama saya memposting solusi non-LINQ. Ini karena LINQ (= query terintegrasi bahasa ) dimaksudkan untuk digunakan untuk kueri pada koleksi. Semua metode LINQ tidak mengubah koleksi yang mendasarinya, mereka hanya mengembalikan yang baru (atau iterator yang lebih tepat ke koleksi baru). Jadi, apa pun yang Anda lakukan misalnya dengan
Select
tidak mempengaruhi koleksi yang mendasarinya, Anda cukup mendapatkan yang baru.Tentu saja Anda bisa melakukannya dengan
ForEach
(yang bukan LINQ, tetapi, ekstensi padaList<T>
). Tapi ini benar-benar menggunakanforeach
, tetapi dengan ekspresi lambda. Terlepas dari ini, setiap metode LINQ secara internal mengulang koleksi Anda, misalnya dengan menggunakanforeach
ataufor
, namun itu menyembunyikannya dari klien. Saya tidak menganggap ini lebih mudah dibaca atau dipelihara (bayangkan mengedit kode Anda saat debugging metode yang mengandung ekspresi lambda).Setelah mengatakan ini seharusnya tidak menggunakan LINQ untuk memodifikasi item dalam koleksi Anda. Cara yang lebih baik adalah solusi yang sudah Anda berikan dalam pertanyaan Anda. Dengan loop klasik, Anda dapat dengan mudah mengulang koleksi Anda dan memperbarui item-itemnya. Sebenarnya semua solusi yang diandalkan
List.ForEach
itu tidak berbeda, tetapi jauh lebih sulit untuk dibaca dari sudut pandang saya.Jadi Anda tidak boleh menggunakan LINQ dalam kasus-kasus di mana Anda ingin memperbarui elemen koleksi Anda.
sumber
for
loop lain "di bawah tenda". Saya merasa ini adalah sintaksis gula untuk menciptakan cara-cara sederhana dalam melakukan tugas-tugas sederhana, bukan untuk menjadi pengganti pengkodean standar.Saya sudah mencoba beberapa variasi dalam hal ini, dan saya terus kembali ke solusi orang ini.
http://www.hookedonlinq.com/UpdateOperator.ashx
Sekali lagi, ini adalah solusi orang lain. Tapi saya sudah mengkompilasi kode ke perpustakaan kecil, dan menggunakannya secara teratur.
Saya akan menempelkan kodenya di sini, untuk kemungkinan situsnya (blog) tidak ada lagi di masa mendatang. (Tidak ada yang lebih buruk daripada melihat posting yang mengatakan "Inilah jawaban tepat yang Anda butuhkan", Klik, dan URL Mati.)
sumber
Action<TSource>
alih - alih membuat delegasi tambahan. Itu mungkin belum tersedia pada saat penulisan itu.where T: struct
untuk menangkap ini pada waktu kompilasi.Tidak, LINQ tidak mendukung cara pembaruan massal. Satu-satunya cara yang lebih pendek adalah dengan menggunakan
ForEach
metode ekstensi - Mengapa tidak ada metode ekstensi ForEach di IEnumerable?sumber
Saya menulis beberapa metode ekstensi untuk membantu saya.
Saya menggunakannya seperti ini:
Untuk referensi cek argumen:
sumber
2 sen saya: -
sumber
Anda bisa menggunakan LINQ untuk mengonversi koleksi Anda menjadi sebuah array dan kemudian memanggil Array.ForEach ():
Jelas ini tidak akan berfungsi dengan koleksi struct atau tipe inbuilt seperti integer atau string.
sumber
Berikut adalah metode ekstensi yang saya gunakan ...
sumber
List<T>.ForEach
juga, tetapi hanya untuk semuaIEnumerable
.Saya berasumsi Anda ingin mengubah nilai di dalam kueri sehingga Anda bisa menulis fungsi untuk itu
Tetapi jangan shure jika ini yang Anda maksud.
sumber
Anda bisa menggunakan Magiq , kerangka operasi batch untuk LINQ.
sumber
Misalkan kita memiliki data seperti di bawah ini,
dan jika kita ingin memodifikasi daftar dan mengganti nilai daftar yang ada dengan nilai yang dimodifikasi, maka pertama-tama buat daftar kosong baru, kemudian lewati daftar data dengan menerapkan metode modifikasi pada setiap item daftar,
sumber