Bagaimana cara mengubah a List<MyObject>
menjadi an IEnumerable<MyObject>
dan kemudian kembali lagi?
Saya ingin melakukan ini untuk menjalankan serangkaian pernyataan LINQ pada Daftar, misalnya Sort()
c#
linq
list
ienumerable
TK.
sumber
sumber
Jawaban:
sumber
using System.Linq;
atau Anda tidak akan dapat ToList ()A
List<T>
adalahIEnumerable<T>
, jadi sebenarnya, tidak perlu 'mengubah' aList<T>
menjadiIEnumerable<T>
. Karena aList<T>
adalahIEnumerable<T>
, Anda cukup menetapkan aList<T>
ke variabel tipeIEnumerable<T>
.Sebaliknya, tidak semua
IEnumerable<T>
adalahList<T>
offcourse, jadi Anda harus memanggilToList()
metode anggotaIEnumerable<T>
.sumber
A
List<T>
sudah menjadiIEnumerable<T>
, jadi Anda dapat menjalankan pernyataan LINQ langsung padaList<T>
variabel Anda .Jika Anda tidak melihat metode ekstensi LINQ seperti yang
OrderBy()
saya duga, itu karena Anda tidak memilikiusing System.Linq
arahan di file sumber Anda.Anda perlu mengubah hasil ekspresi LINQ kembali menjadi
List<T>
secara eksplisit, meskipun:sumber
Selain: Perhatikan bahwa operator LINQ standar (seperti contoh sebelumnya) tidak mengubah daftar yang ada -
list.OrderBy(...).ToList()
akan membuat daftar baru berdasarkan urutan yang diurutkan ulang. Namun, cukup mudah untuk membuat metode ekstensi yang memungkinkan Anda menggunakan lambda denganList<T>.Sort
:Kemudian Anda dapat menggunakan:
Ini memperbarui daftar yang ada dengan cara yang sama seperti
List<T>.Sort
biasanya.sumber
ToList
- Saya akan menjelaskan, meskipun.Mengonversi
List<T>
menjadiIEnumerable<T>
List<T>
implementIEnumerable<T>
(dan banyak lainnya sepertiIList<T>, ICollection<T>
) oleh karena itu tidak perlu mengonversi List kembali ke IEnumerable karena sudah menjadiIEnumerable<T>
.Contoh:
Anda juga bisa menggunakan
Enumerable.AsEnumerable()
metodeMengonversi
IEnumerable<T>
menjadiList<T>
Ini berguna dalam Entity Framework .
sumber
Untuk mencegah duplikasi dalam memori, resharper menyarankan ini:
.ToList () mengembalikan daftar baru yang tidak bisa diubah. Jadi perubahan pada listAgain tidak mempengaruhi myList dalam jawaban @Tamas Czinege. Ini benar dalam kebanyakan kasus untuk setidaknya dua alasan: Ini membantu mencegah perubahan di satu area yang mempengaruhi area lain (kopling longgar), dan ini sangat mudah dibaca, karena kita seharusnya tidak mendesain kode dengan masalah kompiler.
Tetapi ada contoh tertentu, seperti berada dalam loop ketat atau bekerja pada sistem memori tertanam atau rendah, di mana pertimbangan compiler harus dipertimbangkan.
sumber