Guia do artigo:

ArrayList

A classe ArrayList é uma solução alternativa ao uso de arrays em .NET, tendo como principal diferencial a possibilidade de se expandir quando se adiciona novos elementos, não sendo necessário definir sua capacidade suportada na inicialização. De forma semelhante, quando um elemento é removido, o tamanho da lista é reduzido, poupando memória.

Esta classe funciona como uma lista de objetos (System.Object), ou seja, pode-se adicionar elementos de qualquer tipo a um ArrayList e, mesmo assim, é possível localizar itens, ordenar a lista, identificar quais elementos são de determinado tipo, entre outras funcionalidades.

Vejamos os principais métodos da classe:

  • Add(object): adiciona um elemento no final da lista.
  • AddRange(ICollection): adiciona à lista os elementos de uma coleção pasada como parâmetro.
  • AsParallel(): retorna uma ParallelQuery que utiliza vários processadores, caso existam, para efetuar consulta aos
  • elementos com Linq (inclusive com lambda expressions).
  • AsQueryable(): retorna um objeto IQueryable, no qual é possível efetuar consultas com Linq, inclusive usando
  • expressões lambda.
  • BinarySearch(object): busca pelo objeto passado como parâmetro na lista, retornando seu índice, caso exista.
  • BinarySearch(object, IComparer): busca pelo objeto parâmetro na lista, considerando a comparação feita pelo
  • IComparer. No caso de classes próprias, é preciso definir um IComparer adequado.
  • Cast<Tipo>(): converte os elementos da lista para o Tipo definido, retornando uma coleção com os novos itens.
  • Clear(): remove todos os elementos da lista.
  • Clone(): retorna uma cópia do ArrayList.
  • Contains(object): retorna true se o objeto passado como parâmetro existe na lista, caso contrário, retorna false.
  • CopyTo(int, Array, int, int): copia uma certa quantidade(quarto parâmetro) de elementos da lista, a partir de um índice
  • (primeiro parâmetro), para um Array(segundo parâmetro) a partir de um outro índice nesse array(terceiro parâmetro).
  • GetEnumerator(): retorna uma coleção IEnumerator com os itens da lista, porém, no IEnumerator, os elementos não
  • podem ser alterados, apenas lidos.
  • GetRange(int, int): retorna um ArrayList contendo uma certa quantidade (segundo parâmetro) de elementos a partir do
  • índice especificado (primeiro parâmetro).
  • IndexOf(object): esta função retorna o índice (zero-based) do objeto procurado na lista, caso este exista.
  • Insert(int, object): o método Insert adiciona um elemento na lista em uma determinada posição. Os itens após este
  • ponto são deslocados uma posição adiante.
  • InsertRange(int, ICollection): semelhante ao Insert, porém insere uma coleção de itens ao invés de um único elemento.
  • LastIndexOf(object): retorna o índice da última ocorrência do objeto procurado na lista, caso o objeto não seja
  • encontrado, o resultado é -1 (assim como na maioria dos métodos de busca).
  • OfType<Tipo>(): retorna uma coleção com os itens da lista que são do tipo especificado. Essa lista resultante, porém, é
  • apenas para visualização, seus itens não podem ser alterados.
  • Remove(object): caso o objeto passado como parâmetro seja localizado, ele é removido da lista.
  • RemoveAt(int): remove da lista o elemento da posição indicada no parâmetro.
  • RemoveRange(int, int): remove uma quantidade de elementos (segundo parâmetro) a partir do índice indicado (primeiro
  • parâmetro).
  • Reverse(): inverte a ordem dos elementos.
  • SetRange(int, ICollection): insere os itens de uma coleção passada como parâmetro para o ArrayList a partir de uma
  • determinada posição. Os elementos existentes inicialmente nessa faixa de valores são substituídos pelo que foram
  • adicionados.
  • Sort(): ordena os elementos em ordem crescente. Caso os elementos sejam de uma classe específica cuja comparação
  • não é explícita, é necessário usar uma sobrecarga desse método que recebe um objeto IComparer.
  • ToArray(): retorna um Array com os objetos contidos na lista.

É fácil perceber que se torna muito mais prático trabalhar com ArrayList em comparação com arrays, principalmente pelo fato de não precisar se preocupar com o tamanho da lista e o posicionamento dos elementos.

Hashtable

A classe Hashtable localizada no namespace System.Collections, como o próprio namespace sugere, é uma coleção de objetos onde cada elemento é composto por uma chave e um valor. Assim como a classe ArrayList, o Hashtable é flexível, ou seja, pode-se adicionar objetos de qualquer tipo (pois é uma coleção de object) e seu tamanho se adapta à quantidade de itens que contém, expandindo e contraindo suas dimensões.

Os elementos podem ser acessados pela respectiva chave e essa chave deve ser única para cada item, facilitando a localização de um objeto específico. Em comparação com o acesso aos elementos de um array, o Hashtable adapta-se mais facilmente a diversas situações, pois a chave não necessariamente é um número, pelo contrário, trata-se de um object. Por exemplo, podemos usar um Hashtable para representar um determinado objeto, quando não é preciso criar um struct ou uma classe para isso. Vejamos a Listagem 1 onde usamos uma coleção desse tipo para representar as configurações de um sistema, armazenando informações de vários tipos diferentes.

Como foi dito, as chaves são valores únicos. Ao tentar inserir uma chave duplicada, é gerada uma exceção do tipo ArgumentException, informando que a chave que se está tentando inserir já existe.

Listagem 1: Exemplo de utilização do Hashtable.

Hashtable config = new Hashtable();
//Valor do tipo Int32
config[“VERSAO”] = 1;
 //Valor do tipo String
config[“DIRETORIO”] = “C:\\Sistema”;
//Valor do tipo DateTime
config[“VALIDADE”] = DateTime.Today.AddMonths(1); 

Principais propriedades

  • Count: Quantidade de elementos contidos na lista.
  • Keys: Coleção de objetos usados como chaves na lista.
  • Values: Coleção de objetos contidos na lista (os valores e não as chaves).

Principais métodos

  • Add(object key, object value): Adiciona um objeto à lista, juntamente com uma chave que o identifica.
  • AsQueryable(): Retorna uma coleção IQueryable, na qual se pode executar consultas com LINQ (inclusive com Lambda Expressions).
  • Cast(): Converte os elementos da coleção para o tipo especificado, os quais são retornados em uma coleção IEnumerable.
  • Clear(): Exclui todos os elementos da lista.
  • Clone(): Cria uma cópia do objeto (da lista).
  • Contains(object key) e ContainsKey(object key): funcionam igualmente, retornando true se a chave especificada nos parâmetros existe na lista, ou false em caso contário.
  • ContainsValue(object value): Retorna true se o valor informado está contido na lista (nos valores e não nas chaves).
  • Remove(object key): Exclui da lista o valor relativo à chave informada nos parâmetros.

BitArray

A classe BitArray, como o nome sugere, é uma coleção de bits, que porém são tratados como bool. Ou seja, os elementos possuem valor true se o respectivo bit vale 1, ou false se o bit vale 0.

De modo geral, o BitArray funciona como um vetor de bool (bool[]), a principal diferença é a possibilidade de inverter todos os valores de uma única vez e comparar duas listas (comparando cada elemento e retornando um BitArray com os resultados).

Principais propriedades

  • Count: Quantidade de elementos contidos na coleção (apenas leitura).
  • Length: Semelhante ao count, com a diferença de que pode ser alterado.

Principais métodos

  • And(BitArray value): Compara dois objetos BitArray, item a item, e retorna um terceiro BitArray com o resultado da operação AND
  • entre os itens dos dois primeiros.
  • Get(int index): Retorna true ou false, de acordo com o valor do elemento na posição indicada.
  • Not(): Inverte o valor de todos os elementos, ou seja, os que forem true passam a ser false e vice-versa.
  • Or(BitArray value): Semelhante ao método And, porém a operação realizada entre os itens é a operação booleana OR.
  • Set(int index, bool value): Define o valor do elemento na posição index conforme o parâmetro informado.
  • SetAll(bool value): Define o valor de todos os elementos da lista como true ou false de acordo com o parâmetro value.
  • Xor(BitArray value): Funciona da mesma forma que as funções And e Or, porém, a operação booleana é a XOR (OU Exclusivo).

As demais operações como Clone, AsQueryable e CopyTo funcionam da mesma forma que nas demais coleções.

Conclusão

Ficamos por aqui com esse artigo sobre as classes ArrayList, Hashtable e BitArray na linguagem C#, caso tenham alguma dúvida podem ficar a vontade em me perguntar nos comentários.

Com o conteúdo desse artigo eu acredito que seja possível qualquer pessoa começar a entender melhor o funcionamento de classes em C#.

Confira também