Katakanlah saya memiliki permintaan LINQ seperti:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Mengingat itu authorsList
bertipe List<Author>
, bagaimana saya bisa menghapus Author
elemen dari authorsList
yang dikembalikan oleh permintaan ke authors
?
Atau, dengan kata lain, bagaimana saya bisa menghapus semua nama sam yang menyamai Bob authorsList
?
Catatan: Ini adalah contoh sederhana untuk keperluan pertanyaan.
Contains
pemeriksaan cepat, dan memastikan Anda hanya mengevaluasi urutan sekali.List<T>
, tidak apa-apa untuk menggunakannya.authorsList = authorsList.Where(x => x.FirstName != "Bob")
Akan lebih baik menggunakan Daftar <T> .RemoveAll untuk melakukannya.
sumber
Jika Anda benar-benar perlu menghapus item, lalu bagaimana dengan Kecuali ()?
Anda dapat menghapus berdasarkan daftar baru, atau menghapus on-the-fly dengan membuat Linq.
sumber
Except()
adalah satu-satunya cara untuk pergi di tengah-tengah pernyataan LINQ.IEnumerable
tidak punyaRemove()
atau tidakRemoveAll()
.Anda tidak dapat melakukan ini dengan operator LINQ standar karena LINQ menyediakan permintaan, bukan memperbarui dukungan.
Tetapi Anda dapat membuat daftar baru dan mengganti yang lama.
Atau Anda dapat menghapus semua item dalam
authors
pass kedua.sumber
RemoveAll()
bukan operator LINQ.Remove
juga merupakan metodeList
<T
>, bukan metode System.Linq.Enumerable .Solusi sederhana:
sumber
Saya bertanya-tanya, apakah ada perbedaan antara
RemoveAll
danExcept
dan pro menggunakanHashSet
, jadi saya telah melakukan pemeriksaan kinerja cepat :)Hasil di bawah ini:
Seperti yang bisa kita lihat, opsi terbaik dalam hal ini adalah menggunakan
RemoveAll(HashSet)
sumber
l2.RemoveAll( new HashSet<string>( toRemove ).Contains );
mengkompilasi dengan baik hanya FYIIni adalah pertanyaan yang sangat lama, tetapi saya menemukan cara yang sangat sederhana untuk melakukan ini:
Perhatikan bahwa karena variabel kembali
authorsList
adalah aList<T>
, yangIEnumerable<T>
dikembalikan olehExcept()
harus dikonversi ke aList<T>
.sumber
Anda dapat menghapus dengan dua cara
atau
Saya memiliki masalah yang sama, jika Anda ingin output sederhana berdasarkan kondisi di mana Anda, maka solusi pertama lebih baik.
sumber
Katakan itu
authorsToRemove
adalahIEnumerable<T>
yang berisi elemen yang ingin Anda hapusauthorsList
.Maka di sini ada cara lain yang sangat sederhana untuk menyelesaikan tugas penghapusan yang diminta oleh OP:
sumber
Saya pikir Anda bisa melakukan sesuatu seperti ini
Meskipun saya pikir solusi yang sudah diberikan menyelesaikan masalah dengan cara yang lebih mudah dibaca.
sumber
Di bawah ini adalah contoh untuk menghapus elemen dari daftar.
sumber
LINQ memiliki asal-usul dalam pemrograman fungsional, yang menekankan kekekalan objek, sehingga tidak menyediakan cara bawaan untuk memperbarui daftar asli di tempat.
Catatan tentang kekekalan (diambil dari jawaban SO lainnya):
Berikut ini definisi kekekalan dari Wikipedia .
sumber
saya pikir Anda hanya perlu menetapkan item dari daftar Penulis ke daftar baru untuk mengambil efek itu.
sumber
Agar kode tetap lancar (jika optimisasi kode tidak penting) dan Anda perlu melakukan beberapa operasi lebih lanjut dalam daftar:
atau
sumber