Convertendo IEnumerable para List em C# de Forma Eficiente
Este artigo explora vários métodos para converter um IEnumerable<T>
em um List<T>
em C#, comparando sua eficiência e adequação a diferentes cenários. Entender as nuances dessas estruturas de dados é crucial para escrever código otimizado e manutenível.
Sumário
- Entendendo
IEnumerable<T>
eList<T>
- Quando Converter
IEnumerable<T>
paraList<T>
- Usando o Método
ToList()
- Usando o Construtor
List<T>
- Usando a Sintaxe de Consulta LINQ
- Usando um Loop
foreach
- Criando Métodos de Extensão Personalizados
- Conclusão
Entendendo IEnumerable<T>
e List<T>
Tanto IEnumerable<T>
quanto List<T>
trabalham com coleções, mas suas características diferem significativamente:
IEnumerable<T>
: Esta interface representa uma sequência de elementos que podem ser iterados usando um loopforeach
. É somente leitura; você não pode adicionar, remover ou modificar elementos diretamente. É ideal para cenários em que você precisa processar elementos sequencialmente sem precisar de acesso aleatório ou modificação.List<T>
: Uma classe concreta representando um array de tamanho dinâmico. Oferece métodos para adicionar, remover, inserir e acessar elementos por índice. Fornece flexibilidade para manipulação, mas consome mais memória, pois armazena toda a coleção na memória.
Quando Converter IEnumerable<T>
para List<T>
A conversão é necessária quando:
- Acesso aleatório:
List<T>
permite acesso direto (e.g.,myList[5]
), ao contrário deIEnumerable<T>
. - Modificação da coleção:
List<T>
suporta adicionar, remover e inserir elementos. - Múltiplas iterações: Converter para
List<T>
pode ser mais eficiente para múltiplas iterações, evitando a enumeração repetida da fonte. - Requisitos de método: Certos métodos ou bibliotecas esperam um
List<T>
como entrada.
Usando o Método ToList()
A abordagem mais eficiente e recomendada é usar o método de extensão LINQ ToList()
:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = numbers.ToList();
Usando o Construtor List<T>
O construtor List<T>
também aceita um IEnumerable<T>
:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>(numbers);
Isso é funcionalmente equivalente a ToList()
.
Usando a Sintaxe de Consulta LINQ
Embora possível, a sintaxe de consulta LINQ é menos concisa e eficiente:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = (from number in numbers select number).ToList();
Usando um Loop foreach
Este é o método menos eficiente, adequado apenas para cenários específicos que exigem processamento individual de elementos durante a conversão:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>();
foreach (int number in numbers)
{
numberList.Add(number);
}
Criando Métodos de Extensão Personalizados
Para conversões especializadas, crie métodos de extensão personalizados. Por exemplo:
public static class MyExtensions
{
public static List<T> ToListAndSort<T>(this IEnumerable<T> source) where T : IComparable<T>
{
List<T> list = source.ToList();
list.Sort();
return list;
}
}
Conclusão
O método ToList()
é a escolha ideal para converter IEnumerable<T>
para List<T>
em C#. Outros métodos são menos eficientes ou menos legíveis, a menos que você tenha um motivo específico para usá-los. Sempre considere as implicações de memória ao lidar com grandes conjuntos de dados.