Tengo un bucle foreach que lee una lista de objetos de un tipo y produce una lista de objetos de un tipo diferente. Me dijeron que una expresión lambda puede lograr el mismo resultado.
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 apreciada, soy nuevo en lambda y linq gracias, s

Respuestas:
Intenta lo siguiente
Esto está utilizando una combinación de Lambdas y LINQ para 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 todos los valores de la colección original. El resultado será devuelto en un nuevo
IEnumerable<TargetType>. La llamada .ToList es un método de extensión que lo convertiráIEnumerable<TargetType>en unList<TargetType>.fuente
TargetType? Terminé con algo como esto:List<ISearchEntity> results = myIQueryable.Select(x => (ISearchEntity) new TargetType { MyField = "Field value is " + x.TargetField }).ToList();donde el objetivo era obtener un objeto de tipoList<ISearchEntity>Si sabe que desea convertir de
List<T1>a,List<T2>entoncesList<T>.ConvertAllserá un poco más eficiente queSelect/ToListporque sabe el tamaño exacto para comenzar:En el caso más general, cuando solo conoces la fuente como un
IEnumerable<T>, usarSelect/ToListes el camino a seguir. También podría argumentar que en un mundo con LINQ, es más idiomático comenzar ... pero al menos vale la pena conocer laConvertAllopción.fuente
IEnumerable<T>, simplemente llamaSelectyToListsegún la respuesta de Jared.x => buildTargetType(x)fuente
cannot cast expressionexcepciónfuente
Creo que algo como esto debería funcionar:
fuente
.ToList()Debe agregar un al final, de lo contrario, esto simplemente proporcionará un IEnumerable.Aquí hay un ejemplo simple ...
fuente
fuente
Suponga que tiene varias propiedades que desea convertir.
fuente
O con un
constructor&linqconSelect:¡La
Linqlínea es más suave! ;-)fuente
Si necesita usar una función para emitir:
Donde mi función personalizada es:
fuente
para una clase de tipo similar.
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));fuente
Si los tipos se pueden lanzar directamente, esta es la forma más limpia de hacerlo:
Si los tipos no se pueden emitir directamente, puede asignar las propiedades del tipo original al tipo de destino.
fuente
Consideraremos que el primer tipo de Lista es Cadena y queremos convertirlo en un tipo de Lista Entero.
Agregar valores en la lista original.
Crear lista de destino de tipo entero
Imprimir los valores de la lista con forEach:
fuente