Jadi saya punya daftar generik, dan oldIndex
dan newIndex
nilai.
Saya ingin memindahkan item di oldIndex
, ke newIndex
... sesederhana mungkin.
Ada saran?
Catatan
Item tersebut harus berada di antara item di (newIndex - 1)
dan newIndex
sebelum dihapus.
newIndex--
tidak menghasilkan perilaku yang Anda inginkan.ObservableCollection
dan bukan generikList<T>
, tapi itu sepele untuk hanya menukar panggilan metode untuk mendapatkan hasil yang sama.[newIndex - 1]
dan[newIndex]
tidak dapat dibalik.Move(1, 3); Move(3, 1);
tidak mengembalikan daftar ke keadaan awal. Sementara itu ada perilaku berbeda yang disediakanObservableCollection
dan disebutkan dalam jawaban ini , yang tidak dapat dibalik .Jawaban:
Saya tahu Anda mengatakan "daftar generik" tetapi Anda tidak menentukan bahwa Anda perlu menggunakan kelas Daftar (T) jadi di sini ada kesempatan untuk sesuatu yang berbeda.
Kelas ObservableCollection (T) memiliki metode Pindahkan yang melakukan apa yang Anda inginkan.
Di bawahnya pada dasarnya dilaksanakan seperti ini.
Sehingga Anda dapat melihat metode swap yang disarankan orang lain pada dasarnya adalah apa yang dilakukan ObservableCollection dalam metode Move itu sendiri.
UPDATE 2015-12-30: Anda dapat melihat kode sumber untuk metode Move dan MoveItem di corefx sekarang untuk Anda sendiri tanpa menggunakan Reflector / ILSpy karena .NET adalah open source.
sumber
sumber
newIndex
ujian saya yang sebenarnya rusak (lihat jawaban saya di bawah).lock
pernyataan.Saya tahu pertanyaan ini sudah lama tetapi saya mengadaptasi respons kode javascript INI ke C #. Semoga ini bisa membantu
sumber
Daftar <T> .Remove () dan List <T> .RemoveAt () tidak mengembalikan item yang sedang dihapus.
Karena itu Anda harus menggunakan ini:
sumber
Masukkan item saat ini di
oldIndex
berada dinewIndex
kemudian hapus instance asli.Anda harus mempertimbangkan bahwa indeks item yang ingin Anda hapus dapat berubah karena penyisipan.
sumber
Saya membuat metode ekstensi untuk memindahkan item dalam daftar.
Indeks tidak boleh bergeser jika kami memindahkan item yang ada karena kami memindahkan item ke posisi indeks yang ada dalam daftar.
Huruf tepi yang @Oliver rujuk di bawah (memindahkan item ke akhir daftar) sebenarnya akan menyebabkan tes gagal, tetapi ini adalah desain. Untuk memasukkan item baru di akhir daftar kami hanya akan memanggil
List<T>.Add
.list.Move(predicate, list.Count)
harus gagal karena posisi indeks ini tidak ada sebelum pindah.Bagaimanapun, saya telah membuat dua metode ekstensi tambahan,
MoveToEnd
danMoveToBeginning
, sumbernya dapat ditemukan di sini .sumber
Ensure.Argument
didefinisikan?List<T>
Anda dapat meneleponInsert(list.Count, element)
untuk menempatkan sesuatu di akhir daftar. Jadi AndaWhen_new_index_is_higher
harus meneleponlist.Move(x => x == 3, 5)
yang sebenarnya gagal.List<T>
saya hanya akan menelepon.Add
untuk memasukkan item baru ke akhir daftar. Saat memindahkan item individual, kami tidak pernah menambah ukuran asli indeks karena kami hanya menghapus satu item dan memasukkannya kembali. Jika Anda mengklik tautan dalam jawaban saya, Anda akan menemukan kode untukEnsure.Argument
.Saya harapkan:
... atau:
... akan melakukan trik, tetapi saya tidak memiliki VS pada mesin ini untuk memeriksa.
sumber
newIndex
jika setelaholdIndex
.Cara termudah:
EDIT
Pertanyaannya tidak terlalu jelas ... Karena kita tidak peduli ke mana
list[newIndex]
barang tersebut saya pikir cara paling sederhana untuk melakukan ini adalah sebagai berikut (dengan atau tanpa metode ekstensi):Solusi ini adalah yang tercepat karena tidak melibatkan penyisipan / pemindahan daftar.
sumber
Apakah lebih sederhana kawan lakukan saja ini
Lakukan hal yang sama dengan MoveDown tetapi ubah if untuk "if (ind! = Concepts.Count ())" dan Concepts.Insert (ind + 1, item.ToString ());
sumber
Ini adalah bagaimana saya menerapkan metode ekstensi elemen bergerak. Ini menangani bergerak sebelum / sesudah dan ke ekstrem untuk elemen dengan cukup baik.
sumber