Am o buclă foreach citind o lista de obiecte de un tip și produce o listă de obiecte de un tip diferit. Mi s-a spus că o expresie lambda poate obține același rezultat.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Orice ajutor ar fi apreciat - am'm noi de la lambda si linq multumesc, s
Încercați următoarele
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
Acest lucru este folosind o combinație de Lambda și LINQ pentru a obține soluția. Funcția de Selectare este o proiecție stil de metoda care se va aplica trecut în delega (sau lambda în acest caz) pentru fiecare valoare în colecția originală. Rezultatul va fi returnat într-o nou IEnumerable<TargetType>
. A .ToList apel este o metodă de prelungire, care va converti acest IEnumerable<TargetType> "într-o" Listă<TargetType>
.
Dacă știu vrei pentru a converti din Listaapoi [
Listă][1] va fi puțin mai eficient decât "Selectați" /
ToList pentru că știe exact dimensiunea pentru a începe cu:
target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
În cazul general, când știi numai despre sursa ca o IEnumerable<T>
, folosind Selectați
/ToList
este calea de a merge. Ai putea de asemenea, susțin că într-o lume cu LINQ, l's mai idiomatice pentru a începe cu... dar l's valoare de cel puțin conștienți fiind de ConvertAll
opțiune.
Cred că ceva de genul acesta ar trebui să funcționeze:
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
Să presupunem că aveți mai multe proprietăți pe care doriți să o convertiți.
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 })
Dacă aveți nevoie pentru a utiliza o funcție pentru a arunca:
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list2 = list1.ConvertAll(x => myConvertFuntion(x));
În cazul în care obiceiul meu de funcție este:
private Type2 myConvertFunction(Type1 obj){
//do something to cast Type1 into Type2
return new Type2();
}
Sau cu un constructor` & "link-ul" cu "Selectați":
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-ul
linie este mai moale! ;-)