Diferença entre as classes Array e ArrayList - Programação em C# ASP.NET

Ambas são usadas pra se armazenar objetos em lista (vetor).

Array é uma classe abstrata. Diferentemente doutras classes, cria-se um objeto dela com o método CreateInstance. Ou seja, é uma espécie de classe-gato.

ArrayList é destinada a hereditariedade. Destinada pra algo do tipo TMeuArrayList: ArrayList.
E os objetos dessa classe podem ser facilmente redimensionados.


Exemplificando

O exemplo monta uma lista principal de 5 elementos. Cada elemento (objeto do tipo TElemento) armazena um DateTime e uma lista de frases (strings). Há também um inteiro chamado Sequencial. Esse inteiro é usado como chave primária pra identificar cada elemento dentro da lista principal. É que tanto a lista principal como a de frases podem ser ordenadas.


Essa figura mostra uma tabela montada dinamicamente (TabPrincipal). A lista de objetos é usada pra salvar os dados durante um processo de postback.




Na figura abaixo a lista principal e as frases referentes ao dia 23/06/2009 foram classificadas em ordem crescente.




ArrayList

O exemplo está implementado em 3 versões diferentes.
Uma usando ArrayList, outra usando Array e uma terceira usando um vetor object[].

Pra se personalizar uma ordenação é necessário passar um objeto do tipo IComparer pro ordenador do ArrayList. É prisso que serve TICElemento.

A diferença entre as versões concentra-se em Montar.
Na versão ArrayList os elementos são adicionados (Lista.Add) dinamicamente.
Na versão com vetor (object[]) também. A diferença é que dá mais trabalho pra se fazer.
Já na versão Array, o tamanho da lista precisa ser fixo. Pra redimensionar, só fazendo a coisa manualmente. Ou seja, criar um novo Array e copiar os dados do anterior.


  default.aspx  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="default.aspx.cs" Inherits="TPrincipal" %>
<html xmlns="http://www.w3.org/1999/xhtml">
   <head runat="server">
      <title>ArrayList</title>
   </head>
   <body>
      <form id="FormPrincipal" runat="server">
         <asp:table id="TabPrincipal" runat="server" borderwidth="1" width="80%" cellspacing="0" enableviewstate="false" />
         <br /><br /><br /><br />
         <asp:button id="BotaoOrdenarC" runat="server" text="Ordenar Lista pela data (crescente)" 
         onclick="BotaoOrdenarC_Click" />
         &nbsp;&nbsp;
         <asp:button id="BotaoOrdenarD" runat="server" text="Ordenar Lista pela data (decrescente)" 
         onclick="BotaoOrdenarD_Click" />
      </form>
   </body>
</html>


  default.aspx.cs (ArrayList)  
using System;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

public class TElemento

{
  public ArrayList Frases;
  public DateTime  DataHora;
  public int       Sequencial;
				
  public TElemento (int ASequencial, DateTime ADataHora, string[] AFrases)

  {
    DataHora  = ADataHora;
    Frases    = new ArrayList ();
    Sequencial= ASequencial;
    foreach (string Frase in AFrases)
      Frases.Add (Frase);
  }
}





public class TICElemento: IComparer

{
  public bool Crescente= true;
  int IComparer.Compare (Object A, Object B)

  {
    int Retorno;

    Retorno= DateTime.Compare (((TElemento) A).DataHora, ((TElemento) B).DataHora);
    if (Crescente)
      return Retorno;
    else
      return Retorno*-1;
  }
}





public partial class TPrincipal: System.Web.UI.Page

{
  protected IComparer ICElemento;
  protected ArrayList Lista

  {
    get {
      return (ArrayList) Session["Default_Lista"];
    }
    set {
      Session["Default_Lista"]= value;
    }
  }
  protected void Page_Load (object sender, EventArgs e)

  {
    ICElemento= new TICElemento ();
    if (!IsPostBack)
      Montar ();
    Listar ();
  }
  protected void BotaoOrdenarC_Click (object sender, EventArgs e)

  {
    ((TICElemento) ICElemento).Crescente= true;
    Lista.Sort (ICElemento);
    Listar ();
  }
  protected void BotaoOrdenarD_Click (object sender, EventArgs e)

  {
    ((TICElemento) ICElemento).Crescente= false;
    Lista.Sort (ICElemento);
    Listar ();
  }
  protected void BotaoOrdenarFrases_Click (object sender, EventArgs e)

  {
    int      Sequencial;
    string[] Partes;

    Partes    = ((Button) sender).ID.Split (new Char [] {'_'}, 2);
    Sequencial= Convert.ToInt32 (Partes[1]);

    foreach (TElemento Elemento in Lista)
      if (Elemento.Sequencial == Sequencial) {
        Elemento.Frases.Sort ();
        Listar ();
        return;
      }
  }
  protected void AdcTabelaLinha (Table ATabela, int ASequencial, string[] AValores)

  {
    Button    B;
    TableCell TC;
    TableRow  TR;

    TR= new TableRow ();
    ATabela.Rows.Add (TR);

    // Adiciona as frases
    foreach (string AValor in AValores) {
      TC     = new TableCell ();
      TC.Text= AValor;
      TR.Cells.Add (TC);
    }

    // Adiciona o botão
    B             = new Button ();
    B.Text        = "Ordenar Frases (crescente)";
    B.ID          = "Botao_" + ASequencial.ToString ();
    B.Click      += BotaoOrdenarFrases_Click;

    TC            = new TableCell ();
    TC.Style.Value= "text-align:right";
    TR.Cells.Add (TC);
    TC.Controls.Add (B);
  }
  protected void Montar ()

  {
    Lista= new ArrayList ();

    Lista.Add (new TElemento (0, new DateTime (2009, 07, 25), new string[] {"uva", "laranja", "goiaba"}));
    Lista.Add (new TElemento (1, new DateTime (2009, 07, 02), new string[] {"d", "c", "a", "b"}));
    Lista.Add (new TElemento (2, new DateTime (2009, 07, 01), new string[] {"gato", "cachorro"}));
    Lista.Add (new TElemento (3, new DateTime (2009, 06, 23), new string[] {"2", "1", "3", "0", "5"}));
    Lista.Add (new TElemento (4, new DateTime (2009, 07, 07), new string[] {"vermelho", "verde", "azul"}));
  }
   protected void Listar ()

  {
    int      I, Max= 0;
    string[] Linha= {};

    TabPrincipal.Rows.Clear ();
    foreach (TElemento Elemento in Lista)
      Max= Max < Elemento.Frases.Count ? Elemento.Frases.Count : Max;
    Max++;
    Array.Resize (ref Linha, Max);
    foreach (TElemento Elemento in Lista) {
      Linha[0]= "<span style='color:yellow;background-color:black'>" + Elemento.DataHora.ToString () + "</span>";
      I       = 1;
      foreach (string Frase in Elemento.Frases) {
        Linha[I]= Frase;
        I++;
      }
      while (I < Max) {
        Linha[I]= " ";
        I++;
      }
      AdcTabelaLinha (TabPrincipal, Elemento.Sequencial, Linha);
    }
  }
}



Array

Todos os ArrayList da versão anterior foram substituídos por Array.
Abaixo encontram-se as principais mudanças apenas.
O tamanho da lista principal foi explicitamente limitado a 5.

  default.aspx.cs (Array)  
public class TElemento

{
  public Array    Frases;
  public DateTime DataHora;
  public int      Sequencial;
				
  public TElemento (int ASequencial, DateTime ADataHora, string[] AFrases)

  {
    int I= 0;

    DataHora  = ADataHora;
    Frases    = Array.CreateInstance (typeof (object), AFrases.Length);
    Sequencial= ASequencial;

    // Ou então:     Array.Copy (AFrases, Frases, AFrases.Length);
    foreach (string Frase in AFrases)
      Frases.SetValue (Frase, I++);
  }
}





public partial class TPrincipal: System.Web.UI.Page

{
  protected Array Lista

  {
    get {
      return (Array) Session["Default_Lista"];
    }
    set {
      Session["Default_Lista"]= value;
    }
  }
  protected void Montar ()

  {
    Lista= Array.CreateInstance (typeof (object), 5);

    Lista.SetValue (new TElemento (0, new DateTime (2009, 07, 25), new string[] {"uva", "laranja", "goiaba"}), 0);
    Lista.SetValue (new TElemento (1, new DateTime (2009, 07, 02), new string[] {"d", "c", "a", "b"}), 1);
    Lista.SetValue (new TElemento (2, new DateTime (2009, 07, 01), new string[] {"gato", "cachorro"}), 2);
    Lista.SetValue (new TElemento (3, new DateTime (2009, 06, 23), new string[] {"2", "1", "3", "0", "5"}), 3);
    Lista.SetValue (new TElemento (4, new DateTime (2009, 07, 07), new string[] {"vermelho", "verde", "azul"}), 4);
  }
}



object[]

Nessa versão utiliza-se uma matriz unidimensional simples (vetor).
A variável ListaTmp foi engatinhada aí porque Array.Resize precisa receber um parâmetro por referência. Portanto, o pobre desgraçado de espírito irá discriminar a propriedade Lista.

  default.aspx.cs (object[])  
public class TElemento

{
  public string[] Frases;
  public DateTime DataHora;
  public int      Sequencial;
				
  public TElemento (int ASequencial, DateTime ADataHora, string[] AFrases)

  {
    DataHora  = ADataHora;
    Frases    = AFrases;
    Sequencial= ASequencial;
  }
}





public partial class TPrincipal: System.Web.UI.Page

{
  protected object[] Lista

  {
    get {
      return (object[]) Session["Default_Lista"];
    }
    set {
      Session["Default_Lista"]= value;
    }
  }
  protected void Montar ()

  {
    object[] ListaTmp;

    ListaTmp= new object[] {};

    // Inicialmente uma lista com 4 elementos
    Array.Resize (ref ListaTmp, 4);
    ListaTmp.SetValue (new TElemento (0, new DateTime (2009, 07, 25), new string[] {"uva", "laranja", "goiaba"}), 0);
    ListaTmp.SetValue (new TElemento (1, new DateTime (2009, 07, 02), new string[] {"d", "c", "a", "b"}), 1);
    ListaTmp.SetValue (new TElemento (2, new DateTime (2009, 07, 01), new string[] {"gato", "cachorro"}), 2);
    ListaTmp.SetValue (new TElemento (3, new DateTime (2009, 06, 23), new string[] {"2", "1", "3", "0", "5"}), 3);

    // Redimensionando a lista pra 5 elementos
    Array.Resize (ref ListaTmp, 5);
    ListaTmp.SetValue (new TElemento (4, new DateTime (2009, 07, 07), new string[] {"vermelho", "verde", "azul"}), 4);

    Lista= ListaTmp;
  }
}


  ArrayList class
Array class
Table class
IComparer interface


     


Código fonte

http://transeberiano.brinkster.net