Codigos Fonte, Artigos e Dicas
C# Arrays

Olá a todos,
é verdade depois de um tempo todo mundo aparece… fiquei sem fazer posts nesses últimos dias porque por enquanto eu trabalho com um chefe maluco que joga 3 projetos para eu Administrar, Programar, Criar a Modelagem e Colocar em Produção em apenas 1 mês!
Definitivamente acabou com minha vida, e pra completar vou ter que viajar pra Angola no dia 6 de setembro… é a vida, mas vamos ao que interessa… Arrays em C#!
Bem.. a maioria das pessoas que já desenvolveram podem pular esse paragrafo. O array nada mais é uma seqüência de elementos do mesmo tipo, esses elementos são acessados por um índice do tipo int.
Em questão de memória o Array residem em um bloco contíguo da memória e são tipo-referência, em questão de OO Array também é uma classe, como sempre volto a repetir.. quer saber mais sobre tal classe, interface e etc.? Procure no Object Browser no seu Visual Studio 2008 “CTRL+W, J”.
Declarando e Instânciando Array
A declaração de um array é feito especificando o nome do tipo de elemento seguido por um par de colchetes “[]” e o nome do próprio array:
int[] motosID;
Como toda boa classe sem você instância-la você não faz nada! precisamos criar o objeto. Para instancia-lo utiliza-se a keyword new com o tipo do array seguido com o tamanho dentro de colchetes… Instanciar um array também inicializa seus valores padrões (0, null ou false dependendo do tipo do array)
motosID = new int[9]; // instância o array motos com o tamanho 10 (os índices iniciam contando do 0)
/* Você também pode inicializar, instanciar e definir os valores ao mesmo tempo */
int[] motosID = { 10, 11, 12, 13, 14, 15, 16 };
Também é possível criar Arrays multidimensionais, mas esse não é o objetivo desse artigo.
Você também pode criar Arrays utilizando estruturas (structs) e classe como o tipo do Array.
public class Moto{
// ...
public Moto(){
//Construtor padrão
}
<pre> public Moto(string nomeMoto){
//Construtor com argumento
}</pre>
}
Moto[] intruder = new Moto[1] { new Moto("Intruder125cc"), new Moto("Intruder250cc") };
/* Você pode usar o construtor da classe para iniciar os valores do array */
Iniciando um Array sem Tipo
Muitas vezes você não sabe qual vai ser o tipo do array à ser utilizado, porém você ainda precisa declara-lo… com isso o C# pode “adivinhar” o tipo dos valores que estão sendo utilizados.
var carros = new[]{"Palio", "Siena", "Punto"};
As novidades aqui são: a palavra-chave “var”; a omissão dos colchetes após o tipo (porque não existe tipo aqui ao declarar); a utilização do operador new e os colchetes antes da lista inicializadora.
Para utilizar esse recurso infelizmente você tem que assegurar que todos os valores do array serão iguais se no exemplo acima se eu colocasse depois do punto um valor int você obteria um erro.
Caso os valores sejam compatíveis o compilador converte automaticamente os valores, exemplo:
var numeros = new[]{5, 6, 7, 8, 9, 9.5, 9.6, 9.9, 10} // nesse caso o array não será int mas sim double
Talvez agora para você um array não tipado pode não ter muito sentido, eles são mais úteis utilizados em conjunto com tipos anônimos, mas isso é assunto para outro post.
Acessando Elementos no Array
Agora que já aprendemos a criar um array, precisamos recuperar os valores armazenados lá dentro.
int[] numeros = {1, 2, 3, 4, 5};
Console.WriteLine(numeros[0]); // O valor 1 será impresso na sua tela
//vamos modificar o valor daquela posição do array
numeros[0] = 11;
Console.WriteLine(numeros[0]); // O valor 11 será impresso na sua tela
Como nós sabemos que pode exestir problemas como em qualquer ciração feita pelo ser humano, alguém pode requisitar um índice de acesso que não existe, para isso temos que tratar o erro:
try{
int[] numeros = {1, 2, 3, 4, 5};
Console.WriteLine(numeros[5]);
} catch (IndexOutOfRangeException e){
// código para tratar o erro
}
Não só isso mas existe a necessidade também de percorremos um array inteiro, claro que para isso podemos utilizar o famoso FOR!!!
int[] numeros = {5, 6, 7, 8, 9, 10,, 11, 12, 13, 14, 15};
for(int i = 0; i < numeros.Length; i++){
int numero = numeros[i];
Console.WirteLine(numero);
}
Length é uma propriedade e não um array, por isso não é utilizados colchetes “()” ao acessa-lo. Lembre-se que o índice do array começa com zero então a última posição é Length – 1. Você também pode utilizar o foreach para percorrer um elemento.
int numeros = {5, 6, 7, 8, 9, 10,, 11, 12, 13, 14, 15};
foreach (int numero in numeros){
Console.WriteLine(numero);
}
O foreach declara uma variável de iteração (neste caso o inteiro numero) que recebe cada valor do Array numeros e executa as instruções seguintes, em primeira vista isso é maravilhoso para percorrer, mas infelizmente você fica limitado:
- Percorrer apenas em uma parte do Array, ou pular certos elementos. O foreach percorre ele todo obrigatóriamente
- Percorrer o Array de trás para frente, o foreach percorre o Array sempre do 0 à Lenght -1
- Se o corpo do loop necessita saber o índice ao invéz do valor atual.
- Se você precisar alterar o valor de um elemento no array também ficará limitado
- Etc.
Copiando Arrays
Como um array é um tipo-referência uma variável Array possui uma referência a uma instância do Array, isso quer dizer que ao copiar um Array você acaba copiando a referência e não o Array em si próprio.
int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosSegundo = inteiros;
O problema desse exemplo acima, é que se você modificar alguma valor no Array do inteirosSegundo você estará modificando o valor do Array ponteiros, e vice-versa…
Para copiar o Array é necessário criar outro Array do mesmo tipo e com o mesmo tamanho e criar um FOR para percorrer os valores do Array para o outro Array a ser copiado, exemplo:
int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosCopy = new int[inteiros.Length];
for(int i = 0; i < inteiros.Length; i++){
inteirosCopy[i] = inteiros[i];
}
O legal é que a classe System.Array nos fornece alguns métodos legal, e dentre elas é CopyTo() que copia os valores de um Array para outro partindo de um determinado índice.
int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosCopy = new int[inteiros.Length];
inteiros.CopyTo(inteirosCopy, 0);
Um detalhe é que esse método é estático, então você pode utilizar esse método a partir da própria classe System.Array.
int[] inteiros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
int[] inteirosCopy = new int[inteiros.Length];
Array.CopyTo(inteiros, inteirosCopy, inteirosCopy.Length);
Para mais detalhes de uma olhada no Object Browser do seu Visual Studio.
Você também tem o método Clone no seu objeto de Array ele retorna um object, para copiar os valores é necessário fazer um casting (casting será abordado em outro post, aguardem)
Boa sorte!
Posts Relacionados
| Imprimir artigo | Este artigo foi escrito por Alexandre Santos em 24 24UTC agosto 24UTC 2009 às 20:51, e está arquivado em C# Linguagem. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |

há 3 meses atrás
Estou eu pesquisando sobre array.
Encontrei o seu artigo e fiquei impressionado com a profundidade que você tratou o assunto; óbvio que não abordou tudo e isso é compreensível dado o fato que você parece muito ocupado.
Tenho algumas duvidas.
Eu tenho um int[,] mArray = new int[310,120];
Como saber o valor máximo do array?
Como saber o valor mínimo do array?
Como saber o valor médio do array?
Como somar os valores do array?
Como somar a linha [0,x] do array?
Como somar a coluna [x,0] do array?
Como saber o valor máximo da linha [0,x] deste array?
Como saber o valor mínimo da linha [0,x] deste array?
Como saber o valor máximo dentro de [3,0] até [34,0] deste array?
Como saber o mínimo dentro de [3,0] até [34,0] deste array?
Como saber a média de [3,0] até [34,0] deste array?
Como copiar a seleção de [5,2] até [110,34] deste array para outro array?
Como juntar 2 ou mais arrays em um terceiro array?
Como saber qual ultima posição que tem valor dentro de uma linha do array?
Como saber o tamanho de um array?
De acordo com o contexto; como fazer o acima com arrays unidimensionais?
Um grande abraço,
ocaccy
[Reply]