Katakanlah saya memiliki 3 string dalam Daftar (mis. "1", "2", "3").
Lalu saya ingin memesan ulang mereka untuk menempatkan "2" di posisi 1 (misalnya "2", "1", "3").
Saya menggunakan kode ini (mengatur indexToMoveTo ke 1):
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);
Ini sepertinya berhasil, tetapi saya terkadang mendapatkan hasil yang aneh; terkadang pesanan salah atau item dari daftar semakin dihapus!
Ada ide? Apakah List<T>
jaminan pemesanan?
Terkait:
Apakah Daftar <T> menjamin bahwa barang akan dikembalikan sesuai urutan penambahannya?
c#
.net
collections
SuperSuperDev1234
sumber
sumber
Jawaban:
The
List<>
kelas tidak jaminan pemesanan - hal akan dipertahankan dalam daftar dalam urutan yang Anda menambahkannya, termasuk duplikat, kecuali Anda secara eksplisit semacam daftar.Menurut MSDN:
Nilai indeks harus tetap andal agar ini akurat. Oleh karena itu pesanan dijamin.
Anda mungkin mendapatkan hasil aneh dari kode Anda jika Anda memindahkan item nanti dalam daftar, karena Anda
Remove()
akan memindahkan semua item lain ke satu tempat sebelum panggilan keInsert()
.Bisakah Anda merebus kode menjadi sesuatu yang cukup kecil untuk dikirim?
sumber
List
di setiap buku teks ilmu komputer yang baik. Sama sepertiQueue
danStack
, aList
adalah struktur data yang terdefinisi dengan baik, dapat diprediksi dan dipahami dengan baik - jika implementasi .NET berbeda (atau jika berubah) banyak perangkat lunak akan rusak.Where()
metode LINQ untuk memfilter daftar, Anda mengandalkan implementasi untuk mempertimbangkan item dalam urutan. Itu terjadi (lihat Referenceource.microsoft.com/System.Core/System/Linq/… ), tetapi ini tidak didokumentasikan dalam MSDN. Saya sarankan menggunakanemp.LastOrDefault(x => x.empDept = 'abc')
sebagai dokumentasiLastOrDefault()
tidak menunjukkan itu mempertahankan urutan barang.Berikut adalah 4 item, dengan indeksnya
Anda ingin memindahkan K ke antara A dan E - Anda mungkin berpikir posisi 3. Anda harus berhati-hati tentang pengindeksan di sini, karena setelah menghapus, semua indeks diperbarui.
Jadi Anda menghapus item 0 terlebih dahulu, pergi
Kemudian Anda masukkan pukul 3
Untuk mendapatkan hasil yang benar, Anda harus menggunakan indeks 2. Untuk membuat semuanya konsisten, Anda harus mengirim ke (indexToMoveTo-1)
if indexToMoveTo > indexToMove
, mis.Ini mungkin terkait dengan masalah Anda. Perhatikan kode saya belum diuji!
EDIT : Atau, Anda bisa
Sort
menggunakan pembanding khusus (IComparer
) jika itu berlaku untuk situasi Anda.sumber
Seperti yang dikatakan Bevan, tetapi perlu diingat, bahwa daftar-indeks berbasis 0. Jika Anda ingin memindahkan elemen ke depan daftar, Anda harus memasukkannya di indeks 0 (bukan 1 seperti yang ditunjukkan pada contoh Anda).
sumber
Ini adalah kode yang saya miliki untuk memindahkan item ke satu tempat dalam daftar:
dan ini untuk memindahkannya satu tempat ke atas:
folderImages
adalahListBox
tentu saja sehingga daftar adalahListBox.ObjectCollection
, bukanList<T>
, tapi itu tidak mewarisi dariIList
sehingga harus bersikap sama. Apakah ini membantu?Tentu saja yang pertama hanya berfungsi jika item yang dipilih bukan item terakhir dalam daftar dan yang terakhir jika item yang dipilih bukan item pertama.
sumber
Jika Anda akan mengubah urutan operasi, Anda akan menghindari perilaku aneh: Pertama, masukkan nilai ke tempat yang tepat dalam daftar, dan kemudian hapus dari posisi pertama. Pastikan Anda menghapusnya dengan indeksnya, karena jika Anda akan menghapusnya dengan referensi, Anda mungkin menghapus keduanya ...
sumber