Menu

Array em C#: declarar, Length, ordenar, arrays 2D e jagged

Um array em C# é um bloco de tamanho fixo com elementos de um só tipo. Veja como declarar e inicializar arrays, ler o Length, ordenar e buscar com a classe Array, copiá-los com segurança e trabalhar com arrays 2D e jagged.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Um array guarda um número fixo de elementos de um só tipo, armazenados lado a lado na memória. Você escolhe o tamanho ao criá-lo, lê e escreve elementos por um índice que começa em zero, e o tamanho nunca muda depois disso.

Declarando e inicializando um array

O tipo de um array é o tipo do elemento seguido de []. Há várias formas de criar um:

Saída:

90, 0, 0, 72
Ben
2 prices, 3 days

new int[4] preenche cada elemento com o valor padrão do tipo: 0 para números, false para bool, null para strings e outros tipos de referência. A forma curta { "Ana", "Ben" } só funciona em uma declaração; ao atribuir a uma variável que já existe, você precisa de names = new[] { "Dev", "Eli" };.

Length, índices e o último elemento

Os índices vão de 0 a Length - 1. Length é uma propriedade, então não leva parênteses (ao contrário do método Count() do LINQ).

Saída:

Count: 5
First: 18
Last: 16
Caught IndexOutOfRangeException

Ler ou escrever fora dos limites lança IndexOutOfRangeException em tempo de execução; o compilador não pega isso. A causa comum é uma condição de laço escrita como i <= arr.Length em vez de i < arr.Length.

O C# 8 em diante adiciona a sintaxe de índice a partir do fim e de intervalos, que é mais curta para o último elemento e para fatias:

int last = temps[^1];        // 16
int[] middle = temps[1..4];  // { 21, 25, 19 }, a new array

Percorrendo um array

Um laço for dá o índice; foreach dá cada elemento e é a escolha mais clara quando você só lê.

Saída:

4.95 | 13.20 | 3.58
Total: 21.73

A variável do foreach é somente leitura: p = 0; dentro do laço é um erro de compilação. Para mudar elementos, percorra com índice.

Ordenando, invertendo e buscando

A classe static Array reúne os auxiliares. Array.Sort ordena no próprio array e não retorna nada, então a ordem original se perde.

Saída:

Ascending:  60, 72, 79, 88, 95
Descending: 95, 88, 79, 72, 60
Index of 60: 4
Index of 99: -1
Any above 90: True
First below 75: 72
Ana, ben, chloe
fig, kiwi, banana

Array.IndexOf retorna -1 quando o valor não existe. Array.Find retorna o valor padrão do tipo (0 aqui) quando nada corresponde, o que é ambíguo para números; use Array.FindIndex quando isso importar. Uma ordenação decrescente em uma só chamada é Array.Sort(scores, (a, b) => b.CompareTo(a)).

Se você precisa do resultado ordenado sem mexer no original, o LINQ retorna um array novo: var sorted = scores.OrderBy(s => s).ToArray();. Veja LINQ.

Redimensionando: um array não cresce

O tamanho é fixo. Array.Resize cria um array novo do tamanho pedido, copia os elementos e atualiza a variável que você passa por ref.

Saída:

4
2
True
False

Cada redimensionamento copia todos os elementos. Aumentar um array um item por vez em um laço é lento, e é exatamente o que a List<T> faz por você de forma mais eficiente, dobrando o array interno.

Arrays são tipos de referência: copiando

Atribuir um array a outra variável copia a referência, não os elementos. Os dois nomes passam a apontar para o mesmo array.

Saída:

100
2
0, 100, 2, 3, 0

O mesmo vale quando você passa um array para um método: o método pode mudar os elementos de quem chamou. Clone, Array.Copy, CopyTo e o ToArray() do LINQ fazem todos uma cópia rasa. Em um array de objetos, o array novo guarda referências para os mesmos objetos, então mudar copy[0].Name ainda muda o que original[0] vê.

Comparar arrays com == compara referências. Para comparar o conteúdo, use a.SequenceEqual(b) de System.Linq.

Arrays 2D (multidimensionais)

Uma grade retangular é declarada com uma vírgula dentro dos colchetes. Indexe-a com [row, col].

Saída:

Rows: 2
Cols: 3
Length: 6, Rank: 2
. X . 
. . X 

Length em um array 2D é o número total de elementos (6 em uma grade de 2 por 3), e é por isso que laços aninhados usam GetLength(0) e GetLength(1). Rank é o número de dimensões. Três dimensões funcionam do mesmo jeito: new int[4, 4, 4] e cube[x, y, z]. Um foreach sobre um array 2D visita todos os elementos linha por linha.

Arrays jagged (arrays de arrays)

Um array jagged int[][] é um array cujos elementos são arrays, e cada array interno pode ter o próprio tamanho. Ele combina com dados como "pedidos por cliente", em que as linhas têm tamanhos diferentes.

Saída:

Customer 0: 2 orders, 20, 35
Customer 1: 1 orders, 12
Customer 2: 4 orders, 8, 15, 40, 22
True

new int[3][] cria só o array externo; cada linha começa como null, e orders[0][0] antes de atribuir uma linha lança NullReferenceException. A sintaxe new int[3][4] não é permitida; você cria cada linha.

Use [,] para uma grade de verdade (um tabuleiro, uma matriz, pixels) e [][] quando as linhas têm tamanhos diferentes ou você quer trocar linhas inteiras.

Array vs List

Array T[]List<T>
TamanhoFixo na criaçãoCresce e diminui
ContagemPropriedade LengthPropriedade Count
Adicionar ou removerNão é possível (só Array.Resize)Add, Insert, Remove
Multidimensional[,] e [][]Só listas de listas
Uso típicoTamanho conhecido, tabelas de consulta, buffersColeções que mudam

Converter é uma chamada em qualquer direção: new List<int>(arr) ou arr.ToList(), e list.ToArray(). A List<T> é a versão que cresce.

Erros comuns

  • i <= arr.Length em um laço. O último índice válido é Length - 1; isso lança IndexOutOfRangeException.
  • Imprimir o array diretamente. Console.WriteLine(arr) imprime System.Int32[]; use string.Join.
  • Esperar que Array.Sort retorne o array ordenado. Ele retorna void e ordena no próprio array.
  • Copiar com =. Isso copia a referência; use Clone() ou ToArray().
  • Usar linhas jagged antes de criá-las. Cada linha de new T[n][] é null até ser atribuída.
  • Usar Length para as linhas de um array 2D. Ele conta todos os elementos; use GetLength(0).

Perguntas frequentes

Como obter o tamanho de um array em C#?

Use a propriedade Length: scores.Length. É uma propriedade, não um método, então não leva parênteses. Para um array 2D, Length é o número total de elementos; use GetLength(0) para o número de linhas e GetLength(1) para o número de colunas.

Como ordenar um array em C#?

Array.Sort(arr) ordena o próprio array em ordem crescente. Para ordem decrescente, chame Array.Reverse(arr) depois de ordenar, ou passe uma comparação: Array.Sort(arr, (a, b) => b.CompareTo(a)). Para obter uma cópia ordenada e manter o original, use LINQ: arr.OrderBy(x => x).ToArray().

Qual a diferença entre um array 2D e um array jagged em C#?

Um array 2D int[,] é um único bloco retangular: toda linha tem o mesmo número de colunas, e você o indexa como grid[row, col]. Um array jagged int[][] é um array de arrays: cada linha é um array separado que pode ter o próprio tamanho, e você o indexa como rows[i][j]. Cada linha de um array jagged precisa ser criada antes do uso, senão é null.

Dá para mudar o tamanho de um array em C#?

Não. O tamanho de um array é fixado na criação. Array.Resize(ref arr, newSize) parece redimensionar, mas aloca um array novo, copia os elementos e faz sua variável apontar para o novo. Se o tamanho muda com frequência, use uma List<T>.

Por que imprimir um array mostra System.Int32[]?

Console.WriteLine(arr) chama arr.ToString(), e arrays não o sobrescrevem, então você recebe o nome do tipo. Junte os elementos em uma única string: Console.WriteLine(string.Join(", ", arr)).

Devo usar um array ou uma List em C#?

Use um array quando o número de elementos é conhecido e fixo, como os 12 meses ou um tabuleiro de jogo. Use List<T> quando elementos são adicionados ou removidos ao longo do tempo. Os dois acessam por índice em tempo constante, e uma List<T> guarda os elementos em um array internamente.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR