J'ai une boucle foreach qui lit une liste d'objets d'un type et génère une liste d'objets d'un type différent. On m'a dit qu'une expression lambda peut produire le même résultat.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Toute aide serait appréciée - je suis nouveau à lambda et linq Merci.
Essayez ce qui suit
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
Ceci utilise une combinaison de Lambdas et LINQ pour réaliser la solution. La fonction Select est une méthode de style de projection qui appliquera le délégué passé (ou lambda dans ce cas) à chaque valeur de la collection d'origine. Le résultat sera renvoyé dans un nouveau IEnumerable<TargetType>
. L’appel .ToList est une méthode d’extension permettant de convertir ce IEnumerable<TargetType>
en un List<TargetType>
.
Si vous savez que vous voulez convertir de List<T1>
à List<T2>
, alors List<T>.ConvertAll
sera légèrement plus efficace que Select
ToList
car il connaît la taille exacte avec laquelle commencer:
target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
Dans le cas plus général où vous ne connaissez la source qu'en tant que IEnumerable<T>
, utilisez Select
/ToList
est la voie à suivre. Vous _/pourriez affirmer également que dans un monde avec LINQ, il est plus idiomatique de commencer avec ... mais cela vaut au moins la peine de connaître l'option ConvertAll
.
var target = origList.ConvertAll(x => (TargetType)x);
List<target> targetList = new List<target>(originalList.Cast<target>());
Je crois que quelque chose comme ça devrait marcher:
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
Voici un exemple simple ..
List<char> c = new List<char>() { 'A', 'B', 'C' };
List<string> s = c.Select(x => x.ToString()).ToList();
Supposons que vous souhaitiez convertir plusieurs propriétés.
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 })
Si vous devez utiliser une fonction pour lancer:
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list2 = list1.ConvertAll(x => myConvertFuntion(x));
Où ma fonction personnalisée est:
private Type2 myConvertFunction(Type1 obj){
//do something to cast Type1 into Type2
return new Type2();
}
Ou avec un constructor
& link
avec Select
:
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();
La ligne Link
est plus douce! ;-)