C# – Obtendo todos os IDs de um List Type com o método List.ConvertAll

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. O que ele faz é converter uma Lista (List) de um determinado tipo e um outra Lista cujo o tipo é informado.

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 exige o uso de um delegate, que no caso, está utilizando um método anônimo (ver referências).

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

Comentários

comentários