Início > C# > Estrutura de dados das coleções do .Net (Parte 1)

Estrutura de dados das coleções do .Net (Parte 1)

15 de agosto de 2010 Deixe um comentário Go to comments

Há três anos venho trabalhando com desenvolvimento na plataforma .Net, sempre optando por utilizar a linguagem C# (nada contra VB), e a cada dia fico maravilhado com o poder das classes internas do Framework, até costumo brincar que optei pelo .Net justamente para evitar ficar escrevendo código.  Em 2009, percebi que precisava aproveitar mais estas classes (BCL – Base Class Library) e que ainda me faltava conhecimento sobre o funcionamento interno das mesmas, para suprir isso me dediquei o ano passado a aprender mais sobre o framework e deixar um pouco de lado as ramificações do .Net (Asp.Net, Services e etc). 

Acredito que as facilidades (abstração das implementações) do Framework e as várias ramificações do .net muitas vezes podem não nos motivar a descobrir como as coisas funcionam e por isso alguns desenvolvedor esquecem de alguns conceitos básicos. Foi pensando nisso escrevi este artigo, para falar um pouco sobre algumas das estruturas utilizada em coleções de dados e também propor dicas sobre sua implementação.

Para começar, vamos pensar que as estrutura de dados em resumo são classes utilizadas para organizar os dados e fornecer várias operações em cima do mesmo. E quando estamos desenvolvendo um algoritmo, será que pensamos e testamos qual a melhor estrutura de dados a ser utilizada? Consideramos a quantidade de registro que utilizará esta estrutura ou como esta estrutura irá se comportar com várias operações de leitura e escrita?  Acredito que até pensamos nestes itens, mas pensamos pouco pela sua importância.

 

Array

O Array é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja, que possuam o mesmo tipo, por isso no .Net a classe System.Array esta de forma abstrata (para ser utilizada em todos os Types do .Net), herdando das interfaces ICloneable, IList, ICollection e IEnumerable, provendo métodos de criação, manipulação, busca e ordenação de arrays,  essa talvez seja uma das estruturas mais conhecidas pelos desenvolvedores.  O Array possui algumas características interessantes, sendo:

– Como comentando acima, podemos definir o array como uma sequência de elementos do mesmo tipo. Esta sequência sempre começará do indexador 0; ou seja para um array de 3 elementos teremos a seguinte sequencia: Elemento 0, Elemento 1  e Elemento 2;      

– Para declarar um array no C#, basta utilizar a notação de colchete, exemplo Type[] meuArray; 

– Ao instanciar um array, precisamos indicar a quantidade de elementos, exemplo:

int[] array3elementos = new int[3];

array3elementos[0] = 10;

array3elementos[1] = 12;

array3elementos[2] = 14;

É possível  inicializar o array ao declarar o mesmo, exemplo:

int[] array3elementos = new int[3] { 10, 12, 14 };

 Ou se ainda preferir você pode inicializar sem deixar explicito a quantidade de elementos, exemplo:

int[] array3elementos = { 10, 12, 14 };

– Um array pode conter ‘N’ elementos e ‘N’ dimensões, para saber a quantidade de elementos de um array basta chamar a propriedade Lenght e para descobrir a quantidade de dimensões utilize a propriedade Rank. Para saber a quantidade de elementos em uma dimensão utilize o método GetLenght passando como parâmetro a dimensão.

    – Os elementos do array podem ser acessados diretamente, para fazer isso basta utilizar a notação de colchete e indicar o índice do elemento que deseja acessar, exemplo:

        int[] valores = newint[2];

        int segundoElemento = valores[1];

1-       Declaração de um Array                             

Nota: O CLR verifica se um indice dentro de um array é valido, ou seja, se você criar um array de inteiros com 3 elementos (índice de 0 a 2) e tentar acessar o elemento de indice 3, uma exceção do tipo “System.IndexOutofRangeException” será lançada em sua aplicação.

 

             – O Conteúdo do array é armazenado na memória contigua, garantindo assim mais desempenho na organização dos dados, ainda mais se tratando de processadores que utilizam o algoritmo Shift ¹ . No entanto existem algumas restrições, uma delas é a expansão do array, ou seja, se você possui uma estrutura de 3 elementos e deseja inserir um quarto elemento, terá que criar um novo array com a capacidade desejada (4 elementos), e copiar os elementos do array antigo para esta nova estrutura.

Existem algumas formas de se fazer esta cópia, veja dois exemplos abaixo:

– Utilizando o método estático Copy da classe System.Array: Este método recebe o array de destino, origem e o tamanho dos itens a serem copiados:

//Criando o Array com 2 elementos.

int[] primeiroArray = newint[2];

primeiroArray[0] = 1;

primeiroArray[1] = 2;

 

//Criando um novo Array com 3 elementos.

int[] segundoArray = newint[3];

 

//Efetuando a copia dos elementos do primeiroArray para o segundoArray

System.Array.Copy(primeiroArray, segundoArray, 1);

 

             2-  Exemplo do uso do System.Array.Copy

– Você também pode utilizar o método estático ConstrainedCopy da classe System.Array:  Este método recebe o array de destino e origem, o tamanho dos itens a serem copiados, o  índex do elemento que iniciará a cópia do array de origem e o índex do elemento no array de destino indicando onde o elemento irá começar a ser armazenado como parâmetros. Este método oferece maior segurança nas operações de cópia do Array, ou seja ele garante que se ocorrer uma exceção os dados o array de origem não serão danificados:

//Efetuando a copia segura dos elementos do primeiroArray para o segundoArray

System.Array.ConstrainedCopy(primeiroArray, 0, segundoArray, 0, primeiroArray.Length);

3-  Exemplo do uso do System.Array.ConstrainedCopy

Nota: Se você tiver curiosidade em conhecer a implementação desses métodos usando algum recurso/ferramenta de reflection irá ver que o método System.Array.Copy chama um método interno chamado Copy, os valores do índex tanto destino quanto origem são encontrados através do método  GetLowerBound  e o parâmetro Realiable(Confiável) é passado como falso . O ConstrainedCopy também chama o método Copy, a  diferença é que os índices são passados por parâmetros, evitando assim a operação do GetLowerbound e o parametro Realiable é passado como verdadeiro para o método visível ao COM.

               

Abaixo, segue um exemplo usando alguns recursos do System.Array:

publicclassArrayTest

{

        public ArrayTest()

        {

 

            // Criando um array de string:

            string[] nomeFuncionarios = newstring[5];

            nomeFuncionarios[0] = “Joao Marcos”;

            nomeFuncionarios[1] = “Armando Neves”;

            nomeFuncionarios[2] = “Claudia Mara.”;

            nomeFuncionarios[3] = “Joaquim Antonio”;

            nomeFuncionarios[4] = “Larissa Borges”;

 

            //Revertendo o Array

            System.Array.Reverse(nomeFuncionarios);

           

            //Visualizando os elementos do Array

            System.Console.Write(“\n\n Array Reverso:”);

            foreach (string nomeFuncionario in nomeFuncionarios)

            {

                System.Console.WriteLine(“{0}  “, nomeFuncionario);

            }

            //Ordenando o Array:

            System.Array.Sort(nomeFuncionarios);

 

            //Visualizando os elementos do Array

            System.Console.Write(“\n\n Array Ordenado:”);

            foreach (string nomeFuncionario in nomeFuncionarios)

            {

                System.Console.WriteLine(“{0}  “, nomeFuncionario);

            }

            //Limpando os valores do Array

            System.Array.Clear(nomeFuncionarios, 0, nomeFuncionarios.Length);

        }

}

4-  Exemplo da utilização de alguns recursos disponíveis no System.Array

Referência:
¹ – Para maiores informações acesse:
http://en.wikipedia.org/wiki/Arithmetic_shift
² – Jagged são matrizes de matrizes, para saber mais acesse:  http://msdn.microsoft.com/en-us/library/2s05feca.aspx

Até o próximo artigo.

Abraço,

 

Nelson Borges

 

 

Categorias:C#
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: