var itemToRemove = resultlist.Single(r => r.Id==2);
resultList.Remove(itemToRemove);
Ketika Anda tidak yakin item tersebut benar-benar ada, Anda dapat menggunakan SingleOrDefault . SingleOrDefaultakan kembali nulljika tidak ada item ( Singleakan mengeluarkan pengecualian ketika item tidak dapat ditemukan). Keduanya akan melempar ketika ada nilai duplikat (dua item dengan yang sama id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id==2);if(itemToRemove !=null)
resultList.Remove(itemToRemove);
Ini akan menghapus item 2 dan 3 dan menyimpan item 1 dan 4 - seperti yang ditentukan oleh removeList. Perhatikan bahwa ini terjadi, jadi tidak ada tugas tambahan yang diperlukan.
Tentu saja, Anda juga dapat menggunakannya pada item tunggal seperti:
results.RemoveAll(r => r.ID==4);
di mana ia akan menghapus Bill dengan ID 4 dalam contoh kita.
Pendekatan lain yang serupa (yang menggunakan predikat) adalah dengan menggunakan List.FindIndex/ List.RemoteAt(yang memiliki fitur "baik" atau "tidak begitu baik" sebagai operasi yang bermutasi).
Benar, tetapi berhati-hatilah untuk mengatakan bahwa operasi Daftar sedang bermutasi. Daftar menggunakan larik di belakang layar, dan ia dapat membuat ulang lariknya dengan kapasitas yang lebih kecil atau lebih besar ketika dianggap perlu. Biasanya , penghapusan adalah mutasi in-place dari array yang ada.
KeithS
Ini bukan utas aman, dan untuk kesederhanaannya Anda bisa menggunakan SingleOrDefault, itu tidak perlu dimuat dalam metode statis
Tidak ada yang mengatakan itu aman-thread (dan apakah itu tergantung pada apa yang seharusnya dilakukan oleh thread; mungkin sebenarnya lebih disukai untuk memberikan konstruksi memori yang berbeda dengan thread pekerja dibandingkan membiarkan mereka semua bekerja pada satu koleksi bersamaan). ), dan OP menginginkan semua catatan kecuali yang cocok dengan predikat, jadi SingleOrDefault akan mengembalikan apa yang sebenarnya tidak mereka inginkan. "Metode statis" sebenarnya merupakan metode ekstensi, seperti kebanyakan Linq, dan bekerja kapan pun Anda tidak menginginkannya (satu elemen atau banyak) lebih mudah untuk didefinisikan daripada apa yang Anda lakukan.
KeithS
5
Ada pendekatan lain. Ini menggunakan List.FindIndexdan List.RemoveAt.
Walaupun saya mungkin akan menggunakan solusi yang disajikan oleh KeithS (hanya yang sederhana Where/ ToList) pendekatan ini berbeda karena ia bermutasi objek daftar asli. Ini bisa menjadi "fitur" yang baik (atau buruk) tergantung pada harapan.
Dalam kasus apapun, FindIndex(ditambah dengan penjaga) memastikan RemoveAtakan benar jika ada kesenjangan dalam ID atau memesan salah, dll, dan menggunakan RemoveAt(vs Remove) menghindari suatu kedua O (n) mencari melalui daftar.
var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
resultlist.Items.RemoveAt(1);
?Jawaban singkat:
Hapus (dari daftar
results
)results.RemoveAll(r => r.ID == 2);
akan menghapus item dengan ID 2 diresults
(di tempat).Filter (tanpa menghapus dari daftar asli
results
):var filtered = result.Where(f => f.ID != 2);
mengembalikan semua item kecuali yang memiliki ID 2Jawaban terinci:
Saya pikir
.RemoveAll()
ini sangat fleksibel, karena Anda dapat memiliki daftar ID item yang ingin Anda hapus - silakan perhatikan contoh berikut.Jika Anda memiliki:
dan menetapkan beberapa nilai
results
sebagai berikut:Kemudian Anda dapat menentukan daftar ID yang akan dihapus:
Dan cukup gunakan ini untuk menghapusnya:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
Ini akan menghapus item 2 dan 3 dan menyimpan item 1 dan 4 - seperti yang ditentukan oleh
removeList
. Perhatikan bahwa ini terjadi, jadi tidak ada tugas tambahan yang diperlukan.Tentu saja, Anda juga dapat menggunakannya pada item tunggal seperti:
di mana ia akan menghapus Bill dengan ID 4 dalam contoh kita.
DotNetFiddle: Jalankan demo
sumber
Ada sedikit pembantu Linq yang saya sukai yang mudah diterapkan dan dapat membuat kueri dengan kondisi "di mana tidak" sedikit lebih mudah dibaca:
sumber
List.FindIndex
/List.RemoteAt
(yang memiliki fitur "baik" atau "tidak begitu baik" sebagai operasi yang bermutasi).Ada pendekatan lain. Ini menggunakan
List.FindIndex
danList.RemoveAt
.Walaupun saya mungkin akan menggunakan solusi yang disajikan oleh KeithS (hanya yang sederhana
Where
/ToList
) pendekatan ini berbeda karena ia bermutasi objek daftar asli. Ini bisa menjadi "fitur" yang baik (atau buruk) tergantung pada harapan.Dalam kasus apapun,
FindIndex
(ditambah dengan penjaga) memastikanRemoveAt
akan benar jika ada kesenjangan dalam ID atau memesan salah, dll, dan menggunakanRemoveAt
(vsRemove
) menghindari suatu kedua O (n) mencari melalui daftar.Berikut ini cuplikan LINQPad :
Selamat coding.
sumber
Anda tidak menentukan daftar jenis apa, tetapi Daftar generik dapat menggunakan
RemoveAt(index)
metode, atauRemove(obj)
metode:sumber
Lebih disederhanakan:
tidak perlu membuat objek var baru.
sumber
... atau hanya
resultlist.RemoveAt(1)
jika Anda tahu persis indeksnya.sumber
sumber