Saya telah loop foreach membaca daftar objek dari satu jenis dan menghasilkan daftar objek dari tipe 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 menghargai - i'm baru untuk lambda dan linq terima kasih, s
Coba berikut ini
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
Ini adalah menggunakan kombinasi dari Lambdas dan LINQ untuk mencapai solusi. Pilih fungsi adalah proyeksi gaya metode yang akan menerapkan berlalu dalam mendelegasikan (atau lambda dalam hal ini) untuk setiap nilai dalam koleksi asli. Hasilnya akan dikembalikan dalam keadaan baru IEnumerable<TargetType>
. Yang .Kedaftar call adalah sebuah metode penyuluhan yang akan mengkonversi ini IEnumerable<TargetType>
ke dalam Daftar<TargetType>
.
Jika anda tahu anda ingin mengkonversi dari Daftar<T1>
untuk Daftar<T2>
maka klik disini<T>.ConvertAll
akan sedikit lebih efisien daripada Pilih
/Kedaftar
karena ia tahu ukuran yang tepat untuk memulai dengan:
target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
Dalam kasus yang lebih umum ketika anda hanya tahu tentang sumber sebagai IEnumerable<T>
, menggunakan Pilih
/Kedaftar
adalah cara untuk pergi. Anda bisa juga berpendapat bahwa di dunia dengan LINQ, it's lebih idiomatik untuk memulai dengan... tapi itu's bernilai setidaknya menyadari ConvertAll
pilihan.
Saya percaya sesuatu seperti ini harus bekerja:
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
Asumsikan bahwa anda memiliki beberapa properti yang anda ingin mengkonversi.
public class OrigType{
public string Prop1A {get;set;}
public string Prop1B {get;set;}
}
public class TargetType{
public string Prop2A {get;set;}
public string Prop2B {get;set;}
}
var list1 = new List<OrigType>();
var list2 = new List<TargetType>();
list1.ConvertAll(x => new OrigType { Prop2A = x.Prop1A, Prop2B = x.Prop1B })
Jika anda perlu untuk menggunakan fungsi untuk cor:
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list2 = list1.ConvertAll(x => myConvertFuntion(x));
Di mana saya fungsi kustom adalah:
private Type2 myConvertFunction(Type1 obj){
//do something to cast Type1 into Type2
return new Type2();
}
Atau dengan pembina
& link
dengan Pilih
:
public class TargetType {
public string Prop1 {get;set;}
public string Prop1 {get;set;}
// Constructor
public TargetType(OrigType origType) {
Prop1 = origType.Prop1;
Prop2 = origType.Prop2;
}
}
var origList = new List<OrigType>();
var targetList = origList.Select(s=> new TargetType(s)).ToList();
Link
line lebih lembut! ;-)