O LINQ, juntamente com as Lambda Expressions resolveram problemas que em versões anteriores do .NET Framework eram feitos através de Loops ou coisa parecida.
Um exemplo típico é quando desejamos obter um lista do IDs de uma lista tipada de objetos, por exemplo, Cliente ou Produto. Não tem jeito. É preciso um Loop for/while/foreach para capturar determinada lista.
Porém, a partir do .NET Framework 2.0 e o lançamento do Generics, trabalhos em listas passaram a ser bem mais simples. Neste caso, que faz a proeza é o método List.ConvertAll
Um exemplo de seu uso (da própria Microsoft) pode ser visto abaixo:
using System; using System.Drawing; using System.Collections.Generic; public class Example { public static void Main() { List lpf = new List (); lpf.Add(new PointF(27.8F, 32.62F)); lpf.Add(new PointF(99.3F, 147.273F)); lpf.Add(new PointF(7.5F, 1412.2F)); Console.WriteLine(); foreach( PointF p in lpf ) { Console.WriteLine(p); } List lp = lpf.ConvertAll( new Converter (PointFToPoint)); Console.WriteLine(); foreach( Point p in lp ) { Console.WriteLine(p); } } public static Point PointFToPoint(PointF pf) { return new Point(((int) pf.X), ((int) pf.Y)); } } /* O código de exemplo produz a seguinte saída: {X=27.8, Y=32.62} {X=99.3, Y=147.273} {X=7.5, Y=1412.2} {X=27,Y=32} {X=99,Y=147} {X=7,Y=1412} */ |
Porém, é possível dar exemplo “mais real”. Imagine que você tenha um classe Usuário e que ela tenha seus atributos tradicionais (ID, Nome, Idade, etc…). O código abaixo
// declara uma lista tipada da classe User List Users = new List(); // adiciona alguns registros Users.Add(new User(1, "User 1")); Users.Add(new User(2, "User 2")); Users.Add(new User(3, "User 3")); // coleta uma lista tipada de int contendo os ids dos usuários com o método List.ConvertAll List userIds = Users.ConvertAll(delegate(User user) { return user.ID; }); // imprime no Console foreach(int id in userIds) { Console.WriteLine(s); } |
Note que o uso do List.ConvertAll
Uma mão da roda (para quem não tem LINQ)!
Referências:
http://msdn.microsoft.com/en-us/library/0yw3tz5k%28VS.80%29.aspx
http://msdn.microsoft.com/en-us/library/73fe8cwf%28VS.85%29.aspx
http://pontonetpt.com/blogs/israelaece/archive/2005/05/23/P4746.aspx