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>.ConvertAll
será un poco más eficiente queSelect
/ToList
porque sabe el tamaño exacto para comenzar:En el caso más general, cuando solo conoces la fuente como un
IEnumerable<T>
, usarSelect
/ToList
es 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 laConvertAll
opción.fuente
IEnumerable<T>
, simplemente llamaSelect
yToList
según la respuesta de Jared.x => buildTargetType(x)
fuente
cannot cast expression
excepció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
&linq
conSelect
:¡La
Linq
lí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