Eu tenho um loop foreach lendo uma lista de objetos de um tipo e produzindo uma lista de objetos de um tipo diferente. Disseram-me que uma expressão lambda pode alcançar o mesmo resultado.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Qualquer ajuda seria apreciada- eu sou novo no lambda e linq obrigado, s
Respostas:
Tente o seguinte
Isso está usando uma combinação de Lambdas e LINQ para obter a solução. A função Selecionar é um método de estilo de projeção que aplicará o delegado passado (ou lambda nesse caso) a todos os valores da coleção original. O resultado será retornado em um novo
IEnumerable<TargetType>
. A chamada .ToList é um método de extensão que o converteráIEnumerable<TargetType>
em umList<TargetType>
.fonte
TargetType
? Eu acabei com algo como isto:List<ISearchEntity> results = myIQueryable.Select(x => (ISearchEntity) new TargetType { MyField = "Field value is " + x.TargetField }).ToList();
onde o objetivo era fazer com que um objeto do tipoList<ISearchEntity>
Se você sabe que deseja converter de
List<T1>
paraList<T2>
então,List<T>.ConvertAll
será um pouco mais eficiente queSelect
/ToList
porque sabe o tamanho exato para começar:No caso mais geral, quando você conhece apenas a fonte como uma
IEnumerable<T>
, usarSelect
/ToList
é o caminho a percorrer. Você também pode argumentar que, em um mundo com LINQ, é mais idiomático para começar ... mas vale a pena pelo menos estar ciente daConvertAll
opção.fonte
IEnumerable<T>
, basta ligarSelect
e deToList
acordo com a resposta de Jared.x => buildTargetType(x)
fonte
cannot cast expression
exceçãofonte
Eu acredito que algo assim deve funcionar:
fonte
.ToList()
no final, caso contrário, isso simplesmente fornecerá um IEnumerable.Aqui está um exemplo simples ..
fonte
fonte
Suponha que você tenha várias propriedades que deseja converter.
fonte
Ou com um
constructor
elinq
comSelect
:A
Linq
linha é mais suave! ;-)fonte
Se você precisar usar uma função para transmitir:
Onde minha função personalizada é:
fonte
para classe de tipo semelhante.
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
fonte
Se os tipos puderem ser convertidos diretamente, é a maneira mais limpa de fazer isso:
Se os tipos não puderem ser convertidos diretamente, você poderá mapear as propriedades do tipo original para o tipo de destino.
fonte
Vamos considerar que o primeiro tipo de lista é String e queremos convertê-lo para o tipo inteiro da lista.
Adicione valores na lista original.
Criar lista de destino do tipo inteiro
Imprimir valores da lista usando forEach:
fonte