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.
Já 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.
|
|
<!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" />
<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.
|
|
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;
}
}
|
|