2010-09-28 79 views
10

Así que tengo una lista de objetos con varias propiedades. Entre estas propiedades están nombre y id. Llamemos a este objeto ExtendedObject. También he declarado una nueva lista de diferentes objetos que tienen sólo las propiedades nombre y id. Llamemos a este objeto BasicObject.Listas de C#: cómo copiar elementos de una lista a otra, pero solo ciertas propiedades

Lo que me gustaría hacer es convertir o copiar (a falta de mejores palabras) la Lista de objetos ExtendedObject a una lista de objetos BasicObject. Yo sé C# Las listas tienen una gran cantidad de métodos interesantes que pueden ser útiles, por lo que se preguntó si había una manera fácil de decir algo en el sentido de:

basicObjectList = extendedObjectList.SomeListMethod<BasicObject>(some condition here); 

Pero me doy cuenta de que puede acabar mirando nada de eso . También me di cuenta de que podía recorrer la lista de ExtendedObjects, crear un nuevo BasicObject a partir de cada nombre e identificación de ExtendedObject, e insertarlo en una lista de BasicObjects. Pero esperaba algo un poco más elegante que eso.

¿Alguien tiene alguna idea? Muchas gracias.

Respuesta

22

Depende exactamente cómo le gustaría construir su BasicObject de un ExtendedObject, pero que probablemente podría utilizar el método ConvertAll:

List<BasicObject> basicObjectList = 
    extendedObjectList.ConvertAll(x => new BasicObject 
              { 
               id = x.id, 
               name = x.name 
              }); 

O, si lo prefiere, puede utilizar el método de LINQ Select y luego convert back to a list:

List<BasicObject> basicObjectList = 
    extendedObjectList.Select(x => new BasicObject 
             { 
              id = x.id, 
              name = x.name 
             }).ToList(); 
7

si está en .NET 3.5 o mayor esto podría hacerse mediante el uso de proyecciones de LINQ:

basicObjectList = extendedObjectList.Select(x => new BasicObject { Id=x.Id, Name=x.Name}) 
3
var basicObjectList = extendedObjectList.Select(eo => new BasicObject { name = eo.name, id = eo.id }); 
0

creo que la sugerencia del PO de "BasicObject" era un seudónimo de un objeto resultante con un subconjunto específico de inmuebles de la serie original. Los tipos anónimos son tus amigos (como lo indica @mumtaz).

Suponiendo que la siguiente extendedObjectList si de IEnumerable <T> (incluyendo una lista):

// "var" used so that runtime infers the type automatically 
var subset = extendedObjectList 
    // you can use any Linq based clause for filtering 
    .Where(a => <conditions>) 
    // where the runtime creates a runtime anonymous type to describe your "BasicObject" 
    .Select(a => new { a.Property1, a.Property2, a.Property3 }) 
    // conversion to a List collection of your anonymous type 
    .ToList(); 

En este punto, subconjunto contiene una lista de un anónimo (tiempo de ejecución) tipo que contiene tres propiedades - Propiedad1, Propiedad2, Propiedad3.

se puede manipular esta lista resultante de la siguiente manera:

// execute an anonymous delegate (method) for each of the new anonymous objects 
subset.ForEach 
(
    basicObject => 
    { 
     Console.WriteLine("Property1 - {0}", basicObject.Property1); 
     Console.WriteLine("Property2 - {0}", basicObject.Property2); 
     Console.WriteLine("Property3 - {0}", basicObject.Property3); 
    } 
); 

// grab the first object off the list 
var firstBasicObject = subset.First(); 

// sort the anonymously typed list 
var sortedSubset = subset.OrderBy(a => a.Property1).ToList(); 

Una vez que el tiempo de ejecución ha resuelto el nuevo objeto (de cualquier combinación de propiedades del objeto de origen), se puede usar prácticamente cualquier manera que usted desea .

Para aplicaciones Linq-a-SQL (utilizando IQueryable <T>), la declaración Select se puede utilizar para obtener datos de la columna específicas (en lugar de toda la fila), creando de este modo un tipo anónimo para describir un subconjunto de datos de columna para una fila dada.

Cuestiones relacionadas