C#
- Usando a classe LinkedList<T>
![]() |
Neste artigo veremos como usar a classe LinkedList<T>. |
A classe LinkedList<T> é uma implementação básica de uma lista duplamente ligada. Isso significa que você pode adicionar ou remover itens no meio de uma lista ligada muito rapidamente (porque não há nenhum item para mover para cima ou para baixo na memória contígua), mas você também perde a capacidade de indexar itens pela posição rapidamente.
Na maioria das vezes, tendemos a favorecer o uso da classe List<T> sobre LinkedList<T> a menos que você está fazendo um monte de inclusões e exclusões de itens na coleção, caso em que usar a classe LinkedList<T> pode fazer mais sentido.
Assim se você precisa de uma estrutura de dados vinculada que permita adicionar e remover elementos com facilidade pode usar a classe genérica LinkedList<T>.
Para declarar uma lista vinculada, use o tipo genérico LinkedList<T>, em que T é o tipo de elemento.
Ao contrário dos outros tipos de coleção padrão, a lista vinculada não é apoiada por uma matriz. O tipo LinkedList <T> armazena valores em um tipo de wrapper chamado LinkedListNode<T>.
Cada nó na árvore fornece uma referência aos nós seguintes e anteriores, formando um link (portanto, lista vinculada) entre cada nó, em uma ordem linear. Essa estrutura torna essa lista bastante diferente para da List<T>.
A seguir temos um diagrama para ajudar você a entender a estrutura:
Vejamos um exemplo prático de utilização desta classe.
recursos usados:
Usando LinkedList<T>
Crie um projeto do tipo console chamado CShp_LinkedList no VS 2017 Community.
using System;
using System.Collections.Generic;
namespace CShp_LinkedList
{
class Program
{
static void Main(string[] args)
{
LinkedList<string> meses = new LinkedList<string>();
meses.AddLast("Março");
meses.AddFirst("Janeiro");
var março = meses.Find("Março");
meses.AddBefore(março, "Fevereiro");
meses.AddAfter(março, "Abril");
foreach (string mes in meses)
{
Console.WriteLine(mes);
}
}
}
}
|
Existem várias maneiras de adicionar itens à lista, determinados por onde você deseja adicionar o item. Em primeiro lugar, como a lista tem uma cabeça e uma cauda, as operações de AddFirst e AddLast estão disponíveis para adicionar itens nessas posições.
meses.AddLast("Março");
meses.AddFirst("Janeiro");
Você também pode inserir um valor em uma parte específica da lista usando uma instância de um LinkedListNode <T> que pertence à lista. Você usa essa instância de nó, como uma âncora para inserir o valor, antes ou após.
Para obter uma instância do nó, você pode usar o método Find ou FindLast:
var março = meses.Find("Março");
Com a instãncia obtida você pode usar os métodos AddBefore e AddAfter:
meses.AddBefore(março, "Fevereiro");
meses.AddAfter(março,
"Abril");
Podemos também criarum um LinkedListNode<T> antes de adicioná-lo e usá-lo para ancorar outro valor:
var node = new LinkedListNode<string>("Maio");
// Adiciona o node
meses.AddLast(node);
O resultado da execução do código acima é visto a seguir:
Removendo itens da lista
A lista vinculada fornece o método Remove padrão,
mas também fornece algumas alternativas para remover elementos em posições
específicas. Veja as opções:
meses.Remove("Março"); // Encontra e remove o
item
meses.Remove(node); //
Remove o node especifico
meses.RemoveFirst(); //
Remove o primeiro item da lista
meses.RemoveLast(); //
Remove o ultimo item da lista
Incluindo no código original :
Executando o projeto novamente iremos obter agora:
Com qualquer operação de remoção, a lista precisa atualizar os nós de cada lado do nó, para que eles não apontem mais para o nó, e sim um ao outro:
<-- [NodeA] <--> [NodeB] <--> [NodeC] -->
// Antes de remover
<-- [NodeA] <--> [NodeC] -->
// Após remover
Quando você chama o método Remove, passando o valor que deseja remover, a lista executa uma pesquisa para localizar o nó na lista que contém o valor.
Se você chamar Remove passando uma instância de LinkedListNode<T>, ela validará que o nó realmente pertence à lista, antes de removê-la. Se o nó não pertencer à lista atual, ele lançará uma InvalidOperationException.
Abaixo temos uma pequena tabela que compara o desempenho de operações entre List<T> e LinkedList<T>:
Operação | Melhor Desempenho |
Adicionar / Remover Nodes | List<T> |
Inserir Nodes | LinkedList<T> |
Acesso indexado | List<T> |
Procurar Node | List<T> |
Pegue o
código projeto aqui:
CShp_LinkedList.zip
"Sujeitai-vos, pois, a Deus, resisti ao diabo, e ele fugirá de vós." Tiago 4:7
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
ASP .NET Core 2 - MiniCurso Básico - Macoratti
ASP .NET Core - Macoratti
Conceitos - .NET Framework versus .NET Core - Macoratti
ASP .NET Core - Conceitos Básicos - Macoratti.net
C# - Escolhendo a coleção correta para sua necessidade - Macoratti
C# - Revendo conceitos sobre Generics - Macoratti
C# - Usando Generics (revisitado) - II - Macoratti
NET - Generics - Macoratti.net
VB .NET - Vinculando uma lista genérica a um Grid - Macoratti.net