2009-12-15 47 views
146

Tengo un ciclo foreach leyendo una lista de objetos de un tipo y produciendo una lista de objetos de un tipo diferente. Me dijeron que una expresión lambda puede lograr el mismo resultado.convertir una lista de objetos de un tipo a otro utilizando la expresión lambda

var origList = List<OrigType>(); // assume populated 
var targetList = List<TargetType>(); 

foreach(OrigType a in origList) { 
    targetList.Add(new TargetType() {SomeValue = a.SomeValue}); 
} 

Cualquier ayuda sería appreciated- soy nuevo lambda y LINQ gracias, s

+0

@mmcrae esa pregunta es más nuevo que éste –

Respuesta

220

Pruebe lo siguiente

var targetList = origList 
    .Select(x => new TargetType() { SomeValue = x.SomeValue }) 
    .ToList(); 

Esto es usando una combinación de lambdas y LINQ a lograr la solución. La función Seleccionar es un método de estilo de proyección que aplicará el delegado pasado (o lambda en este caso) a cada valor en la colección original. El resultado será devuelto en un nuevo IEnumerable<TargetType>. La llamada .ToList es un método de extensión que convertirá este IEnumerable<TargetType> en List<TargetType>.

+0

¿Hay una manera de hacer esto sin tener una aplicación concreta para 'TargetType ¿? Terminé con algo como esto: 'List results = myIQueryable.Select (x => (ISearchEntity) new TargetType {MyField =" El valor del campo es "+ x.TargetField}). ToList();' donde el objetivo era obtener un objeto de tipo 'List ' –

7

creo que algo como esto debería funcionar:

origList.Select(a => new TargetType() { SomeValue = a.SomeValue}); 
+0

. Debe agregar '.ToList()' al final; de lo contrario, esto simplemente proporcionará un IEnumerable. – MattD

169

Si sabe desea convertir de List<T1> a List<T2> continuación List<T>.ConvertAll será ligeramente más eficiente que Select/ToList porque conoce el tamaño exacto de comenzar con:

target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue }); 

En el caso más general cuando solo se conoce la fuente como IEnumerable<T>, usando Select/ToList es el camino a seguir. Usted podría también argumentan que en un mundo con LINQ, es más idiomático comenzar ... pero al menos vale la pena conocer la opción ConvertAll.

+1

al principio no pensé que podría hacer esto, porque estaba lidiando con un ienumerable (para la lista fuente y no proporciona una opción convertall) así que llamé a .ToList() y ahora estoy intentando convertall - me gusta más que poner un 'dónde' no filtrado ' – Stratton

+2

¿Por qué necesitarías un dónde? Si solo tiene 'IEnumerable ', simplemente llame a 'Seleccionar' y 'ToList' según la respuesta de Jared. –

+0

Para otros novatos como yo, también puedes llamar a un método como 'x => buildTargetType (x)' – Snekse

7
var list1 = new List<Type1>(); 
var list2 = new List<Type2>(); 

list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 })); 
7

Aquí está un ejemplo sencillo ..

List<char> c = new List<char>() { 'A', 'B', 'C' }; 

List<string> s = c.Select(x => x.ToString()).ToList(); 
+1

Impresionante ... ¡exactamente lo que estaba buscando! Bueno, no exactamente ... Solo quería una propiedad de cada Elemento de la lista, pero me diste la sintaxis de lamba sin tener que desplazarte demasiado lejos. ;) – erroric

25
List<target> targetList = new List<target>(originalList.Cast<target>()); 
+3

-1 esto solo funcionaría si el casting fuera posible y en el caso de OPs parece ser así. –

36
var target = origList.ConvertAll(x => (TargetType)x); 
+0

¿Qué es esta sintaxis? Esto no remonta una lambda. Algún enlace de documentación sería apreciado. Gracias, sin embargo, funciona bien aquí –

+0

El argumento para ConvertAll es una lambda C# normal, ¿verdad? –

Cuestiones relacionadas