C#: Matrizes
1. Declaração e inicialização de uma matriz unidimensional
Em C#, as matrizes são tipos de referência armazenados no heap. Declare uma matriz usando o tipo seguido de colchetes, com indexação a partir de zero.
▶ Exemplo
int[] nums1 = new int[5];
int[] nums2 = new int[5] { 10, 20, 30, 40, 50 };
int[] nums3 = { 1, 2, 3, 4, 5 };
string[] names = { "Alice", "Bob", "Carol" };
Console.WriteLine(nums1[0]);
Console.WriteLine(nums2[2]);
Console.WriteLine(nums3.Length);
Console.WriteLine(names[1]);
0
30
5
Bob
Aviso: new int[5] cria um array cujos elementos são automaticamente inicializados com valores padrão (0 para int, null para string).
2. Acesso por índice e verificação de limites
Os acessos às matrizes em C# são feitos por índice, e o ambiente de execução realiza a verificação de limites. Um índice fora do intervalo gera uma exceção IndexOutOfRangeException, ao contrário do comportamento indefinido em C.
▶ Exemplo
int[] nums = { 10, 20, 30, 40, 50 };
nums[0] = 99;
Console.WriteLine(nums[0]);
Console.WriteLine(nums[nums.Length - 1]);
try
{
int val = nums[5];
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Index out of range!");
}
99
50
Index out of range!
Dica: Use a propriedade Length para obter o comprimento da matriz, em vez de sizeof, como em C.
3. Métodos comuns da classe Array
A classe Array oferece métodos estáticos para ordenação, inversão, pesquisa, cópia e muito mais.
▶ Exemplo
int[] nums = { 5, 3, 8, 1, 9, 2 };
Array.Sort(nums);
Console.WriteLine(string.Join(", ", nums));
Array.Reverse(nums);
Console.WriteLine(string.Join(", ", nums));
int idx = Array.IndexOf(nums, 8);
Console.WriteLine(idx);
int[] copy = new int[3];
Array.Copy(nums, copy, 3);
Console.WriteLine(string.Join(", ", copy));
Array.Clear(nums, 0, 2);
Console.WriteLine(string.Join(", ", nums));
Array.Resize(ref nums, 8);
Console.WriteLine(nums.Length);
1, 2, 3, 5, 8, 9
9, 8, 5, 3, 2, 1
1
9, 8, 5
0, 0, 5, 3, 2, 1
8
Dica: Clear define os elementos no intervalo especificado com seus valores padrão, em vez de removê-los. Resize pode alterar o comprimento da matriz.
4. Matrizes multidimensionais (matrizes retangulares)
Matrizes multidimensionais, também chamadas de matrizes retangulares, têm o mesmo comprimento em todas as linhas. Use vírgulas para separar as dimensões na declaração; por exemplo, int[,] para uma matriz 2D.
▶ Exemplo
int[,] matrix = new int[3, 4];
matrix[0, 0] = 1;
matrix[1, 2] = 5;
matrix[2, 3] = 9;
int[,] grid = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Console.WriteLine(grid[0, 1]);
Console.WriteLine(grid[2, 0]);
Console.WriteLine(grid.Length);
Console.WriteLine(grid.Rank);
2
7
9
2
Dica: Rank retorna o número de dimensões, enquanto Length retorna o número total de elementos (o produto de todas as dimensões).
5. Matrizes irregulares
Uma matriz irregular é uma matriz de matrizes, na qual cada linha pode ter um comprimento diferente. Declare-a usando vários conjuntos de colchetes.
▶ Exemplo
int[][] jagged = new int[3][];
jagged[0] = new int[] { 1, 2 };
jagged[1] = new int[] { 3, 4, 5, 6 };
jagged[2] = new int[] { 7, 8, 9 };
Console.WriteLine(jagged[0].Length);
Console.WriteLine(jagged[1][2]);
Console.WriteLine(jagged[2][0]);
int[][] scores = {
new int[] { 90, 85 },
new int[] { 78, 92, 88 },
new int[] { 95 }
};
Console.WriteLine(scores[1][1]);
2
5
7
92
Aviso: Matrizes irregulares diferem das matrizes retangulares: int[,] é uma matriz 2D contígua na memória, enquanto int[][] é uma matriz 1D cujos elementos são matrizes independentes.
6. Iteração em matrizes com foreach
A instrução foreach simplifica a percorrida de matrizes, eliminando o gerenciamento manual de índices. Ela é adequada para iteração somente de leitura.
▶ Exemplo
string[] fruits = { "Apple", "Banana", "Orange", "Grape" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
int[,] matrix = {
{ 1, 2, 3 },
{ 4, 5, 6 }
};
foreach (int val in matrix)
{
Console.Write(val + " ");
}
Console.WriteLine();
Apple
Banana
Orange
Grape
1 2 3 4 5 6
Dica: Não é possível modificar elementos de uma matriz dentro de um loop foreach. Use um loop for se precisar alterar os valores.
7. Matrizes como parâmetros de método
Os arrays são tipos de referência; portanto, ao passar um array para um método, o que se passa é a referência. As modificações feitas nos elementos do array dentro do método afetam o array original.
▶ Exemplo
void PrintArray(int[] arr)
{
foreach (int n in arr)
{
Console.Write(n + " ");
}
Console.WriteLine();
}
void DoubleValues(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] *= 2;
}
}
int[] nums = { 1, 2, 3, 4, 5 };
PrintArray(nums);
DoubleValues(nums);
PrintArray(nums);
int Sum(int[] arr)
{
int total = 0;
foreach (int n in arr)
{
total += n;
}
return total;
}
Console.WriteLine(Sum(nums));
1 2 3 4 5
2 4 6 8 10
30
Aviso: Como os arrays são passados por referência, as alterações feitas por DoubleValues são refletidas diretamente no array do chamador.
❓ Perguntas Frequentes
P: Em que os arrays do C# diferem dos arrays do C? R: Os arrays do C# são tipos de referência com verificação de limites integrada, que lançam exceções em caso de acesso fora do intervalo; os arrays do C utilizam sintaxe de ponteiro, e o acesso fora dos limites é considerado comportamento indefinido.
P: O que as propriedades Length e Rank retornam? R: A propriedade Length retorna o número total de elementos, e a propriedade Rank retorna o número de dimensões.
P: Quando devo usar uma matriz irregular em vez de uma matriz multidimensional? R: Use matrizes multidimensionais quando todas as linhas tiverem o mesmo comprimento, para obter um layout mais compacto; use matrizes irregulares quando as linhas tiverem comprimentos diferentes.
P: O foreach pode modificar os elementos de uma matriz? R: Não, o foreach é uma iteração somente de leitura. Use um loop for se precisar modificar os valores dos elementos.
P: O método Array.Resize cria um novo array? R: Sim, o método Resize cria um novo array e copia os elementos, substituindo a referência ao array original.
📖 Resumo
- As matrizes em C# são tipos de referência declarados com
Type[], com indexação a partir de zero Lengthretorna o número de elementos; a verificação de limites em tempo de execução gera uma exceçãoIndexOutOfRangeExceptionem caso de acesso fora do intervalo- A classe
Arrayoferece métodos estáticos, comoSort,Reverse,IndexOf,Copy,CleareResize - Matrizes multidimensionais
int[,]têm comprimentos de linha iguais; matrizes irregularesint[][]permitem comprimentos de linha variáveis foreaché ideal para iteração somente leitura, incluindo matrizes multidimensionais- As matrizes são passadas por referência aos métodos; portanto, as modificações feitas dentro do método afetam a matriz original
📝 Exercícios
- Declare uma matriz com 10 inteiros, atribua valores de 1 a 10 usando um loop e, em seguida, imprima todos os elementos na ordem inversa
- Use
Array.Sortpara ordenar uma matriz de strings em ordem alfabética e, em seguida, imprima o resultado - Crie uma matriz 2D de inteiros de 3x3, calcule e imprima a soma dos elementos da diagonal
- Crie uma matriz irregular que armazene as notas de 3 alunos (cada um com um número diferente de disciplinas) e, em seguida, calcule a média de cada aluno
- Escreva um método
int FindMax(int[] arr)que receba um array e retorne o valor máximo