2009-11-09 11 views
18

Si tengo clases de tipo A y B:Crear una lista de un tipo de objeto a partir de una lista de otro utilizando LINQ

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

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

tengo una lista de instancias casos A, ¿cuál es la forma más eficaz de crear y llenar una Lista de tipo B usando Linq?

+0

Su pregunta no es clara ... ¿cuál es la relación entre A y B? –

+0

Básicamente representan lo mismo. En mi caso real, A es una clase generada por Linq a Sql cuando creé una clase de Linq a Sql y le agregué una tabla. Debido a que la clase A tiene linmanencias y dependencias de Linq a Sql, no quiero exponerlo a mis aplicaciones, entonces creo la clase B, que no tiene dependencias. Por lo tanto, necesito completar una lista de instancias de clase B a partir de una lista de instancias de clase A. – Jeremy

Respuesta

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

Hace lo mismo que la solución de eduncan con diferente sintaxis. Haga su elección ..

+0

¿Hay alguna forma de filtrar los valores fuera de la lista A, así que esa lista B no necesita tener todos los elementos que hay en la lista A? – user20358

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

Usted nuevo una instancia de B en su cláusula select, y asignar las propiedades utilizando la función de asignación de propiedad en línea en C# 3.0.

Las ventajas de mapeo en línea se trata de ejecución diferida de su declaración de LINQ. Linq mapeará la declaración modificada y la ejecutará desde su IQueryable. Por ejemplo:

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

Técnicamente, el AsQueryable() es un poco redundante. A veces lo uso para que sea un punto, otros dicen que es absolutamente necesario. No obstante, el objeto de la lista en sí es IQueryable de ClassB.

A continuación, puede llamar FetchAllOfClassB() más arriba en la cadena, y utilizar IQuerable. Es bastante elegante y eficiente.

+2

A punto de escribir algo como esto, ¡pero lo tiene cubierto! +1 – RCIX

+2

Me encanta linq. +1. –

+0

Gracias chicos. Aumentó sus comentarios también. :) – eduncan911

0

Hmm, la parte superior de la cabeza (por lo que probablemente será errores!):

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

podría hacer el truco.

Cuestiones relacionadas