2009-11-09 8 views
18

Si j'ai des classes de type A et B:Créer une liste d'un type d'objet à partir d'une liste d'un autre LINQ

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

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

J'ai une liste d'instances instances A, ce qui est la façon la plus efficace de créer et remplir une liste de type B en utilisant Linq?

+0

Votre question n'est pas claire ... quelle est la relation entre A et B? –

+0

Essentiellement, ils représentent la même chose. Dans mon cas, A est une classe générée par Linq à Sql lorsque j'ai créé une classe Linq to Sql et ajouté une table à celle-ci. Parce que la classe A a des dépendances Linq et Linq to Sql, je ne veux pas l'exposer à mes applications, donc je crée la classe B, qui n'a pas de dépendances. J'ai donc besoin de remplir une liste d'instances de classe B à partir d'une liste d'instances de classe A. – Jeremy

Répondre

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

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

+0

Existe-t-il un moyen de filtrer les valeurs de la listeA afin que ListB n'ait pas besoin de tous les éléments de la listeA? – user20358

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

Vous nouveau une instance de B dans votre clause select, et affecter les propriétés en utilisant la fonction d'affectation de propriété en ligne en C# 3.0.

Les avantages du mappage en ligne proviennent de l'exécution différée de votre instruction Linq. Linq mappera l'instruction modifiée et l'exécutera à partir de 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 utiliser IQuerable. C'est assez lisse et efficace.

+2

Juste sur le point d'écrire quelque chose comme ça, mais vous l'avez couvert! +1 – RCIX

+2

J'adore linq. +1 –

+0

THanks les gars. Upped vos commentaires aussi bien. :) – eduncan911

0

Hmm, du haut 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.