Question Créer une liste d'un type d'objet à partir d'une liste d'un autre en utilisant Linq


Si j'ai des classes de type A et B:

public class A
{
    public int TotalCount;
    public string Title;
}

public class B
{
    public int Count;
    public string Title;
}

J'ai une liste d'instances A instances, quel est le moyen le plus efficace pour créer et remplir une liste de type B en utilisant Linq?


19
2017-11-09 00:34


origine


Réponses:


List<B> listB = listA.Select(a => new B()
   {
        Count = a.TotalCount,
        Title = a.Title
   }).ToList();

Fait la même chose que la solution d'eduncan avec une syntaxe différente. Faites votre choix..


30
2017-11-09 00:55



var list = 
  from a in TableA
  select new B {
    Count = a.TotalCount,
    Title = a.Title
  };

Vous ajoutez une instance de B dans votre clause select et affectez les propriétés à l'aide de la fonctionnalité d'affectation de propriétés en ligne dans C # 3.0.

L'avantage de le mapper en ligne provient de l'exécution différée de votre instruction Linq. Linq mappera l'instruction modifiée et l'exécutera depuis votre IQueryable. Par exemple:

public class ClassA 
{
  public int TotalCount;    
  public string Title;
}

public class ClassB
{
  public int Count;
  public string Title;
}

public IQueryable<ClassB> FetchAllOfClassB()
{
  var list = 
    from a in TableOfClassA
    select new ClassB {
      Count = a.TotalCount,
      Title = a.Title
    };

  return list.AsQueryable();
}

Techniquement, le AsQueryable() est un peu redondant. Parfois, je l'utilise pour en faire un point, d'autres disent que c'est absolument nécessaire. Néanmoins, l'objet liste lui-même est IQueryable de ClassB.

Ensuite, vous pouvez appeler FetchAllOfClassB() plus haut dans la chaîne, et utilisez IQuerable. C'est joli et efficace.


11
2017-11-09 00:39



Hmm, de ma tête (donc il y aura probablement des erreurs!):

List< B > = from a in listOfA select new B(a.count, a.title);

pourrait faire l'affaire.


0
2017-11-09 00:55