web-dev-qa-db-fra.com

convertir une liste d'objets d'un type à un autre en utilisant l'expression lambda

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.

180
Stratton

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>

265
JaredPar

Si vous savez que vous voulez convertir de List<T1> à List<T2>, alors List<T>.ConvertAll sera légèrement plus efficace que SelectToList 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.

194
Jon Skeet
var target = origList.ConvertAll(x => (TargetType)x);
45
Alp
List<target> targetList = new List<target>(originalList.Cast<target>());
27
Pranav

Je crois que quelque chose comme ça devrait marcher:

origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
12
Andy White
var list1 = new List<Type1>();
var list2 = new List<Type2>();

list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
7
Chris Arnold

Voici un exemple simple ..

List<char> c = new List<char>() { 'A', 'B', 'C' };

List<string> s = c.Select(x => x.ToString()).ToList();
7
Ian P

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 })
2
Max Chu

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();
}
0
jaimenino

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! ;-)

0
A. Morel