This article has been localized into Portuguese by the community.
Transformações de dados: O método Select()
Até agora, neste capítulo LINQ do tutorial, trabalhamos com fontes de dados simples, por exemplo, uma lista de números inteiros, strings ou objetos simples, como a classe User. Continuaremos fazendo isso porque é muito prático ao mostrar exemplos dos vários métodos LINQ, mas tenha em mente que com o LINQ, a fonte de dados pode ser um documento XML complexo ou um banco de dados enorme.
Neste artigo, falaremos sobre o método Select(), que permite pegar os dados da fonte de dados e transformá-los em outra coisa. Isso pode ser mais obviamente útil com fontes de dados maiores e mais complexas, como as que eu mencionei acima, mas carregue comigo de qualquer maneira, enquanto tento mostrar a você como o método Select() funciona e o que você pode fazer com ele. Como de costume, vamos direto ao exemplo:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqSelect1
{
class Program
{
static void Main(string[] args)
{
List<User> listOfUsers = new List<User>()
{
new User() { Name = "John Doe", Age = 42 },
new User() { Name = "Jane Doe", Age = 34 },
new User() { Name = "Joe Doe", Age = 8 },
new User() { Name = "Another Doe", Age = 15 },
};
List<string> names = listOfUsers.Select(user => user.Name).ToList();
foreach (string name in names)
Console.WriteLine(name);
}
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
}
}
Observe como posso obter uma lista de objetos, nesse caso do tipo Usuário, e depois usar o método Select() para moldar essa lista em um novo tipo de lista. Neste exemplo, eu transformei a lista de objetos em uma lista de strings contendo os nomes dos usuários. Isso é extremamente prático em muitas situações, em que você precisa que seus dados tenham uma aparência diferente ou quando você precisa apenas de um subconjunto deles. Obviamente, também funciona ao contrário - você pode facilmente criar uma lista de objetos User a partir de uma lista de nomes (você terá que adicionar manualmente a idade deles mais tarde):
List<User> listOfUsers = new List<User>()
{
new User() { Name = "John Doe", Age = 42 },
new User() { Name = "Jane Doe", Age = 34 },
new User() { Name = "Joe Doe", Age = 8 },
new User() { Name = "Another Doe", Age = 15 },
};
List<string> names = listOfUsers.Select(user => user.Name).ToList();
List<User> users = names.Select(name => new User { Name = name }).ToList();
foreach (User user in users)
Console.WriteLine(user.Name);
Observe como eu posso criar novos objetos com o método Select() - é um recurso extremamente poderoso, que permite que você faça praticamente qualquer coisa com seus dados, na hora! Um uso comum para essa funcionalidade é fazer versões menos complexas de um objeto, por exemplo, para retornar em um serviço da web como JSON ou XML. Imagine que você tenha uma classe User com muitas propriedades (aniversário, sexo, email, endereço, país, etc.), mas você só deseja retornar um conjunto limitado dessas propriedades - que também pode fazer sentido, em termos de segurança, Certifique-se de não retornar propriedades de usuário comuns, como nome de usuário e senha. Aqui está um exemplo simplificado - imagine uma classe de usuário muito mais complexa:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqSelect2
{
class Program
{
static void Main(string[] args)
{
List<User> listOfUsers = new List<User>()
{
new User() { Name = "John Doe", Mail = "john@doe.com", Age = 42 },
new User() { Name = "Jane Doe", Mail = "jane@doe.com", Age = 34 },
new User() { Name = "Joe Doe", Mail = "joe@doe.com", Age = 8 },
new User() { Name = "Another Doe", Mail = "another@doe.com", Age = 15 },
};
var simpleUsers = listOfUsers.Select(user => new
{
Name = user.Name,
Age = user.Age
});
foreach (var user in simpleUsers)
Console.WriteLine(user.Name);
}
class User
{
public string Name { get; set; }
public int Age { get; set; }
public string Mail { get; set; }
}
}
}
Neste exemplo, usamos o método Select() para retornar uma lista de tipos anônimos, que contém apenas um subconjunto das propriedades encontradas na fonte de dados. Em seguida, fazemos a saída clássica desses objetos para o console, mas você deve imaginá-los devolvendo-os a um site ou em outro lugar, onde é importante manter o resultado o mais simples possível, sem revelar quaisquer segredos, como senhas etc.
Como já discutimos, eu usarei principalmente a sintaxe de método do LINQ nesses exemplos, mas é claro que as operações que realizamos neste exemplo podem ser expressas com a sintaxe de consulta LINQ também:
// Method syntax
var simpleUsers = listOfUsers.Select(user => new
{
Name = user.Name,
Age = user.Age
});
// Query syntax
var simpleUsersQ = (from user in listOfUsers
select new
{
Name = user.Name,
Age = user.Age
}).ToList();
foreach (var user in simpleUsersQ)
Console.WriteLine(user.Name);
Espero que isso lhe dê uma idéia mais clara de qual sintaxe você prefere, mas o resultado é claro o mesmo!
Resumo
O método Select() permite transformar e modelar dados de sua fonte de dados em novas variantes, por exemplo, selecionando apenas uma única propriedade ou retornando objetos que contêm apenas um subconjunto das propriedades encontradas no objeto de origem.