2009-11-09 18 views
18

Se ho classi di tipo A e B:Creare un elenco di un tipo di oggetto da un elenco di un altro utilizzando Linq

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

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

Ho una lista di istanze casi A, qual è il modo più efficace per creare e popolare un elenco di tipo B utilizzando Linq?

+0

La tua domanda non è chiara ... qual è la relazione tra A e B? –

+0

In sostanza rappresentano la stessa cosa. Nel mio caso, A è una classe generata da Linq a Sql quando ho creato una classe da Linq a Sql e ho aggiunto una tabella. Poiché la classe A ha dipendenze da Linq e Linq to Sql, non voglio esporla alle mie applicazioni, quindi creo la classe B, che non ha dipendenze. Quindi ho bisogno di compilare un elenco di istanze di classe B da un elenco di istanze di classe A. – Jeremy

risposta

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

Fa lo stesso della soluzione di eduncan con sintassi diversa. Fai la tua scelta ...

+0

Esiste un modo per filtrare i valori anche fuori dalla listaA in modo che listB non abbia bisogno di avere ogni elemento presente nell'elenco? – user20358

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

Si aggiunge un'istanza di B nella clausola select e si assegnano le proprietà utilizzando la funzione di assegnazione di proprietà inline in C# 3.0.

I vantaggi della mappatura in linea derivano dall'esecuzione posticipata dell'istruzione Linq. Linq mapperà l'istruzione modificata e la eseguirà dal tuo IQueryable. Ad esempio:

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

Tecnicamente, il AsQueryable() è un po 'ridondante. A volte lo uso per renderlo un punto, altri dicono che è assolutamente necessario. Tuttavia, l'oggetto elenco stesso è IQueryable di ClassB.

Quindi è possibile chiamare FetchAllOfClassB() oltre la catena e utilizzare IQuerable. È piuttosto lucido ed efficiente.

+2

Sto per scrivere qualcosa del genere, ma ne hai parlato! +1 – RCIX

+2

Amo linq. +1. –

+0

Grazie ragazzi. Upped i tuoi commenti pure. :) – eduncan911

0

Hmm, la parte superiore della testa (quindi ci sarà probabilmente errori!):

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

potrebbe fare il trucco.

Problemi correlati