Saya memiliki loop foreach membaca daftar objek dari satu jenis dan menghasilkan daftar objek dari jenis yang berbeda. Saya diberitahu bahwa ekspresi lambda dapat mencapai hasil yang sama.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Setiap bantuan akan dihargai - saya baru untuk lambda dan LINQ terima kasih, s
Jawaban:
Coba yang berikut ini
Ini menggunakan kombinasi Lambdas dan LINQ untuk mencapai solusi. Fungsi Select adalah metode gaya proyeksi yang akan menerapkan delegasi yang disahkan (atau lambda dalam kasus ini) untuk setiap nilai dalam koleksi asli. Hasilnya akan dikembalikan dalam yang baru
IEnumerable<TargetType>
. Panggilan .ToList adalah metode ekstensi yang akan mengubahnyaIEnumerable<TargetType>
menjadiList<TargetType>
.sumber
TargetType
? Saya berakhir dengan sesuatu seperti ini: diList<ISearchEntity> results = myIQueryable.Select(x => (ISearchEntity) new TargetType { MyField = "Field value is " + x.TargetField }).ToList();
mana tujuannya adalah untuk mendapatkan objek bertipeList<ISearchEntity>
Jika Anda tahu Anda ingin mengonversi dari
List<T1>
keList<T2>
makaList<T>.ConvertAll
akan sedikit lebih efisien daripadaSelect
/ToList
karena ia tahu ukuran pasti untuk memulai dengan:Dalam kasus yang lebih umum ketika Anda hanya tahu tentang sumbernya sebagai
IEnumerable<T>
, menggunakanSelect
/ToList
adalah cara untuk pergi. Anda juga bisa berargumen bahwa di dunia dengan LINQ, itu lebih idiomatis untuk memulai dengan ... tapi ada baiknya setidaknya menyadariConvertAll
opsi.sumber
IEnumerable<T>
maka panggil sajaSelect
danToList
sesuai jawaban Jared.x => buildTargetType(x)
sumber
cannot cast expression
pengecualiansumber
Saya percaya sesuatu seperti ini harus bekerja:
sumber
.ToList()
di akhir, jika tidak, ini hanya akan memberikan jumlah IEnumerable.Ini contoh sederhana ..
sumber
sumber
Asumsikan bahwa Anda memiliki beberapa properti yang ingin Anda konversi.
sumber
Atau dengan a
constructor
&linq
denganSelect
:The
Linq
garis lebih lembut! ;-)sumber
Jika Anda perlu menggunakan fungsi untuk melakukan casting:
Di mana fungsi khusus saya:
sumber
untuk kelas sejenis.
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
sumber
Jika jenis dapat dilemparkan langsung, ini adalah cara paling bersih untuk melakukannya:
Jika jenis tidak dapat secara langsung dilemparkan maka Anda dapat memetakan properti dari jenis asli ke jenis target.
sumber
Kami akan mempertimbangkan jenis Daftar pertama adalah String dan ingin mengubahnya menjadi tipe Daftar Integer.
Tambahkan nilai dalam Daftar asli.
Buat daftar target Tipe Integer
Nilai Daftar Cetak menggunakan forEach:
sumber