C#
Coleções genéricas e não-
       genéricas
      Leonardo Melo Santos
      http://about.me/leonardomelosantos
Conteúdo programático
● Coleções não genéricas
  ○ Tipos mais comuns
  ○ Dicionários
  ○ Filas e pilhas
● Generics
  ○ Características
  ○ Exemplos
Coleções
Namespace "System.Collections"
Nome         Descrição

ArrayList    Uma simples coleção de objetos redimensionável e baseada em
             index.

SortedList   Uma coleção de pares nome/valor ordenada por chave.


Queue        Uma coleção de objetos First-in, First-out.


Stack        Uma coleção de objetos Last-in, First-out.


Hashtable    Uma coleção de pares de objeto nome/valor que podem ser
             acessados tanto por nome como por índice. Eficiente para grandes
             quantidades de dados.

BitArray     Coleção Compactas de valores Boolean.
Coleções

Nome                  Descrição

StringCollection      Simples coleção redimensionável de strings.


StringDictonary       Uma coleção de pares de strings nome/valor que podem ser
                      acessados tanto por nome como por index.

ListDictionary        Uma coleção eficiente para armazenar pequenas listas de objetos.


HybridDictionary      Trabalha como uma ListDictionary quando o número de itens a serem
                      armazenados é pequeno e migra para Hashtable quando o número de
                      itens aumenta.

NameValueCollection   Uma coleção de pares de strings nome/valor que podem ser
                      acessados tanto por nome como por index. Podem ser adicionados
                      vários valores em uma mesma chave.
Coleções - ArrayList
● Classe que permite armazenar qualquer
  tipo de informação
  ○ Guarda tipos object
  ○ Tipos por valor causa boxing
● Tamanho é flexível, aumentando quando
  chega ao máximo atual
Coleções - ArrayList - Métodos
● Add: Adiciona o parâmetro no fim da coleção
● AddRange: Adiciona itens de outra coleção no fim
  desta coleção
● Insert: Adiciona item em um índice indicado
● InsertRange: Adiciona itens de outra coleção a partir
  de um índice indicado
● Capacity: Número máximo de elementos do ArrayList;
● Count: Número atual de elementos do ArrayList;
● IndexOf: busca um objeto e retorna o índice onde ele
  está
● Remove: Retira um objeto da lista
Coleções - ArrayList
Ao trabalhar com ArrayList, cuidado com os tipos
guardados. É necessário fazer conversão

ArrayList colecao = new ArrayList();
colecao.Add("Nome");
colecao.Add(3);
colecao.Add(DateTime.Now);
int valor = (int) colecao[1];
if( colecao.Contains("Nome") )
{
   colecao.Remove("Nome");
}
Iterando em coleções
● Necessários para o foreach:
    ○ IEnumerable: GetEnumerator()
    ○ IEnumerator: Current() e MoveNext()

IEnumerator enumerator = coll.GetEnumerator();
while (enumerator.MoveNext()) {
    Console.WriteLine(enumerator.Current);
}
foreach (string item in coll) {
    Console.WriteLine(item);
}
Coleções sequenciais
Coleções sequencias
● Acesso sequencial aos dados
  ○ Queue (fila)
     ■ First In First Out (FIFO)
  ○ Stack (pilha)
     ■ First In Last Out (FILO)
Classe Queue (fila)
Métodos para enfileirar e tirar da fila
● Enqueue: Coloca na fila
● Dequeue: Tira da fila
● Peek(): Em alguns casos é melhor "dar uma olhada"
  no item antes de acessá-lo na fila
           Queue q = new Queue();
           q.Enqueue("First");
           q.Enqueue("Second");
           q.Enqueue("Third");
           while (q.Count > 0) {
              Console.WriteLine(q.Dequeue());
           }
Classe Stack (pilha)
Métodos para empilhar e desempilhar
● Pop()
● Push()

            Stack s = new Stack();
            s.Push("First");
            s.Push("Second");
            s.Push("Third");
            s.Push("Fourth");
            while (s.Count > 0) {
               Console.WriteLine(s.Pop());
            }
Dicionários
Um dicionário
● Criado para mapear chaves a valores
● Classe Hashtable trabalha com casos
● simples

HashTable emailLookup = new HashTable();

// Método Add recebe chave e valor
emailLookup.Add("sbishop@contoso.com", "Bishop, Scott");

// O indexador equivale ao método Add
emailLookup["sbishop@contoso.com"] = "Bishop, Scott";
Iterando um dicionário
●   Deve-se acessar valor ou chave
●   Cada item é um DictionaryEntry
●   Propriedade Value
●   Propriedade Key

foreach (DictionaryEntry elemento in
                            emailLookup)
{
  Console.WriteLine(elemento.Value);
}
Generics
Generics x sem generics
Generics
● Permite que classes, structs, interfaces, delegates e
  métodos sejam parametrizados pelos tipos de dados
  que guardam e manipulam
Sem generics
● Uso de object para generalização
● Constante necessidade de Boxing e Unboxing
● Constante necessidade de casts
Generics
Generics
Por que usar Generics?
● Type checking, sem boxing, sem downcasts
● Reduz a quantidade de código
● Implementação de Generics funciona para
  tipos por valor e por referência
Generics
Também podem ser usados em métodos
Exercícios
1. Alimentar uma coleção não-genérica usando o tipo ArrayList, que
   armazenará objetos de diferentes tipos. Em seguida varrer a lista
   e escrever no Console o resultado do método ToString() de cada
   elemento.
2. Alimentar uma lista genérica usando o tipo List<>, que
   armazenará objetos do tipo de uma classe criada por você. Em
   seguida, varrer a lista e mostrar algum dado do elemento na tela.
   (ConsoleApplication)
3. Alimentar uma coleção genérica usando o tipo KeyValuePair<>,
   onde será indexada por um número e armazenará objetos do tipo
   de uma classe criada por você. Em seguida, varrer a lista e
   mostrar algum dado do elemento na tela. (ConsoleApplication)
Dúvidas

Curso de OO com C# - Parte 05 - Coleções genéricas e não-genéricas

  • 1.
    C# Coleções genéricas enão- genéricas Leonardo Melo Santos http://about.me/leonardomelosantos
  • 2.
    Conteúdo programático ● Coleçõesnão genéricas ○ Tipos mais comuns ○ Dicionários ○ Filas e pilhas ● Generics ○ Características ○ Exemplos
  • 3.
    Coleções Namespace "System.Collections" Nome Descrição ArrayList Uma simples coleção de objetos redimensionável e baseada em index. SortedList Uma coleção de pares nome/valor ordenada por chave. Queue Uma coleção de objetos First-in, First-out. Stack Uma coleção de objetos Last-in, First-out. Hashtable Uma coleção de pares de objeto nome/valor que podem ser acessados tanto por nome como por índice. Eficiente para grandes quantidades de dados. BitArray Coleção Compactas de valores Boolean.
  • 4.
    Coleções Nome Descrição StringCollection Simples coleção redimensionável de strings. StringDictonary Uma coleção de pares de strings nome/valor que podem ser acessados tanto por nome como por index. ListDictionary Uma coleção eficiente para armazenar pequenas listas de objetos. HybridDictionary Trabalha como uma ListDictionary quando o número de itens a serem armazenados é pequeno e migra para Hashtable quando o número de itens aumenta. NameValueCollection Uma coleção de pares de strings nome/valor que podem ser acessados tanto por nome como por index. Podem ser adicionados vários valores em uma mesma chave.
  • 5.
    Coleções - ArrayList ●Classe que permite armazenar qualquer tipo de informação ○ Guarda tipos object ○ Tipos por valor causa boxing ● Tamanho é flexível, aumentando quando chega ao máximo atual
  • 6.
    Coleções - ArrayList- Métodos ● Add: Adiciona o parâmetro no fim da coleção ● AddRange: Adiciona itens de outra coleção no fim desta coleção ● Insert: Adiciona item em um índice indicado ● InsertRange: Adiciona itens de outra coleção a partir de um índice indicado ● Capacity: Número máximo de elementos do ArrayList; ● Count: Número atual de elementos do ArrayList; ● IndexOf: busca um objeto e retorna o índice onde ele está ● Remove: Retira um objeto da lista
  • 7.
    Coleções - ArrayList Aotrabalhar com ArrayList, cuidado com os tipos guardados. É necessário fazer conversão ArrayList colecao = new ArrayList(); colecao.Add("Nome"); colecao.Add(3); colecao.Add(DateTime.Now); int valor = (int) colecao[1]; if( colecao.Contains("Nome") ) { colecao.Remove("Nome"); }
  • 8.
    Iterando em coleções ●Necessários para o foreach: ○ IEnumerable: GetEnumerator() ○ IEnumerator: Current() e MoveNext() IEnumerator enumerator = coll.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); } foreach (string item in coll) { Console.WriteLine(item); }
  • 9.
  • 10.
    Coleções sequencias ● Acessosequencial aos dados ○ Queue (fila) ■ First In First Out (FIFO) ○ Stack (pilha) ■ First In Last Out (FILO)
  • 11.
    Classe Queue (fila) Métodospara enfileirar e tirar da fila ● Enqueue: Coloca na fila ● Dequeue: Tira da fila ● Peek(): Em alguns casos é melhor "dar uma olhada" no item antes de acessá-lo na fila Queue q = new Queue(); q.Enqueue("First"); q.Enqueue("Second"); q.Enqueue("Third"); while (q.Count > 0) { Console.WriteLine(q.Dequeue()); }
  • 12.
    Classe Stack (pilha) Métodospara empilhar e desempilhar ● Pop() ● Push() Stack s = new Stack(); s.Push("First"); s.Push("Second"); s.Push("Third"); s.Push("Fourth"); while (s.Count > 0) { Console.WriteLine(s.Pop()); }
  • 13.
  • 14.
    Um dicionário ● Criadopara mapear chaves a valores ● Classe Hashtable trabalha com casos ● simples HashTable emailLookup = new HashTable(); // Método Add recebe chave e valor emailLookup.Add("sbishop@contoso.com", "Bishop, Scott"); // O indexador equivale ao método Add emailLookup["sbishop@contoso.com"] = "Bishop, Scott";
  • 15.
    Iterando um dicionário ● Deve-se acessar valor ou chave ● Cada item é um DictionaryEntry ● Propriedade Value ● Propriedade Key foreach (DictionaryEntry elemento in emailLookup) { Console.WriteLine(elemento.Value); }
  • 16.
  • 17.
    Generics x semgenerics Generics ● Permite que classes, structs, interfaces, delegates e métodos sejam parametrizados pelos tipos de dados que guardam e manipulam Sem generics ● Uso de object para generalização ● Constante necessidade de Boxing e Unboxing ● Constante necessidade de casts
  • 18.
  • 19.
    Generics Por que usarGenerics? ● Type checking, sem boxing, sem downcasts ● Reduz a quantidade de código ● Implementação de Generics funciona para tipos por valor e por referência
  • 20.
    Generics Também podem serusados em métodos
  • 21.
    Exercícios 1. Alimentar umacoleção não-genérica usando o tipo ArrayList, que armazenará objetos de diferentes tipos. Em seguida varrer a lista e escrever no Console o resultado do método ToString() de cada elemento. 2. Alimentar uma lista genérica usando o tipo List<>, que armazenará objetos do tipo de uma classe criada por você. Em seguida, varrer a lista e mostrar algum dado do elemento na tela. (ConsoleApplication) 3. Alimentar uma coleção genérica usando o tipo KeyValuePair<>, onde será indexada por um número e armazenará objetos do tipo de uma classe criada por você. Em seguida, varrer a lista e mostrar algum dado do elemento na tela. (ConsoleApplication)
  • 22.