Introdução às matrizes 2D em C #

Matrizes bidimensionais são uma coleção de elementos homogêneos que se estendem por várias linhas e colunas, assumindo a forma de uma matriz. Abaixo está um exemplo de uma matriz 2D que possui m linhas e n colunas, criando assim uma matriz de configuração mxn.

( a1, a2, a3, a4, …, an
b1, b2, b3, b4, …, bn
c1, c2, c3, c4, …, cn
.
.
.
m1, m2, m3, m4, …, mn )

Conceito de matrizes irregulares

Uma matriz irregular é uma matriz de matrizes. Matrizes denteadas são essencialmente múltiplas matrizes denteadas juntas para formar uma matriz multidimensional. Uma matriz irregular bidimensional pode ser algo como isto:

( ( a1, a2, a3, a4, …, an ),
( b1, b2, b3, b4, …, b20 ),
( c1, c2, c3, c4, …, c30 ),
.
.
.
( m1, m2, m3, m4, …, m25 ) )

Observe que todas as linhas de uma matriz irregular podem ou não conter o mesmo número de elementos.

Matrizes 2D verdadeiras versus matrizes irregulares

Matrizes irregulares são completamente diferentes de uma matriz 2D verdadeira de uma perspectiva de implementação. É importante entender como o C # implementa matrizes multidimensionais e matrizes irregulares.

As linguagens de programação diferem na implementação de matrizes multidimensionais. Algumas linguagens de programação como C, C ++, C #, Fortran etc. suportam matrizes 2D verdadeiras. Embora existam outros que simulam esse comportamento com matrizes de matrizes, também conhecidas como matrizes irregulares. Então, como uma matriz bidimensional verdadeira é diferente de matrizes irregulares?

As duas implementações de matrizes multidimensionais são diferentes em termos de consumo de armazenamento. Enquanto uma matriz 2D verdadeira teria m linhas de n elementos cada, uma matriz irregular poderia ter m linhas cada uma com diferentes números de elementos. Isso leva a um espaço desperdiçado mínimo para conjuntos de dados. Portanto, a matriz abaixo-irregular é perfeitamente adequada:

int()() jagged array = ( (1, 2, 3, 4),
(5, 6, 7),
(8, 9) )

Se o mesmo conjunto de dados fosse implementado em uma matriz 2D verdadeira, teria sido o seguinte:

int(, ) multiDimArray = ( 1, 2, 3, 4
5, 6, 7, 0
8, 9, 0, 0 )

Operações em matrizes 2D em C #

Aqui, algumas operações em matrizes 2D fornecidas abaixo:

1. Construa a matriz C # 2D

Vamos ver uma maneira de declarar uma matriz 2D em C # e outra maneira de como não declarar uma matriz 2D em C #.

Como?

Uma implementação de matriz 2D verdadeira em C # começa com a declaração de matriz. Parece como abaixo:

int(, ) arr2D;
string(, ) arr2D_s;

O número de vírgulas na definição determina a dimensão da matriz. Observe que você não pode especificar o tamanho da matriz na declaração da matriz. Isso deve ser feito durante a inicialização de uma matriz.

Como não?

É fácil ficar confuso entre as implementações de matrizes 2D e matrizes irregulares. Uma declaração de matriz irregular se parece com:

int()() jagged array;

2. Inicialize a matriz 2D do C #

O próximo passo é inicializar a matriz 2D que acabamos de declarar. Existem várias maneiras de fazer isso.

Usando o novo operador

arr2D = new int(2, 3); //separate initialization
string(, ) arr2D_s = new string(4, 5); //with declaration

Inicializando com valores

//without dimensions
arr2D = new int(, )((1, 2), (3, 4), (5, 6));
//with declaration
arr2D_s = new string(2, 2)((“one”, ”two”), (“three”, “four”));

Sem o novo operador

Int(, ) arr2D_a = ((1, 2), (3, 4), (5, 6), (7, 8));

3. Leia os elementos da matriz C # 2D

Leia um único elemento

A próxima operação é ler os elementos da matriz 2D. Como a matriz 2D é uma matriz de elementos mxn, cada elemento possui uma combinação de índice de linha e índice de coluna designada. Podemos acessar os elementos fornecendo o índice de linha e o índice de coluna no subscrito. Um exemplo está abaixo:

int(, ) arr2D_i = ((1, 2), (3, 4), (5, 6), (7, 8));
string arr2D_s = ((“one”, ”two”), (“three”, “four”));
int val_i = arr2D_i(2, 1); //returns '6'
string val_s = arr2D_s(1, 1); //returns 'four'

Nota- Os índices de linhas e colunas começam em 0. Portanto, a posição do índice (0, 0) é o primeiro elemento e (m-1, n-1) é o último elemento da matriz.

Leia todos os elementos

Mas, o método acima nos fornece o valor de um único elemento na matriz. Como atravessamos toda a matriz para ler todos os elementos dela? A solução simples é percorrer toda a matriz usando loops for / while aninhados.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < 3; i++)
(
for (int j = 0; j < 3; j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Resultado

O método GetLength ()

OK. Mas, o exemplo acima funciona apenas quando eu sei o número de elementos na matriz de antemão. E se minha matriz for dinâmica? Como atravessar todos os elementos de uma matriz dinâmica? Aí vem o método GetLength para nosso resgate.

int arr2D.GetLength (0); // retorna a primeira dimensão (linhas)

int arr2D.GetLength (1); // retorna a segunda dimensão (colunas)

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Resultado

O poder de cada loop

O loop for-each executa um conjunto de comandos para cada elemento da matriz. Este é um mecanismo de loop muito poderoso e é altamente recomendado, pois é mais eficiente do que um loop for tradicional.

Código

using System;
public class Program
(
public static void Main()
(
string(, ) arr2D_s = new string(3, 3)(("one", "two", "three"), ("four", "five", "six"), ("seven", "eight", "nine"));
//reading all the elements through foreach loop
foreach(var ele in arr2D_s)
(
Console.WriteLine(ele);
)
)
)

Resultado

4. Inserir elementos na matriz C # 2D

Agora vamos ver um exemplo de como inserir elementos em uma matriz C # 2D. A idéia é percorrer cada posição da matriz e atribuir um valor a ela.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) squares = new int(3, 3);
int(, ) cubes = new int(3, 3);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
squares(i, j) = arr2D_i(i, j) * arr2D_i(i, j);
cubes(i, j) = squares(i, j) * arr2D_i(i, j);
)
)
Console.WriteLine("Squares\n");
DisplayArray(squares);
Console.WriteLine("\n\nCubes\n");
DisplayArray(cubes);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
( Console.Write(arr(i, j) + "\t"); )
Console.WriteLine("\n");
)
)
)

Resultado

5. Atualizar elementos na matriz C # 2D

Atualizaremos nossa matriz para multiplicar cada elemento com 2. A idéia é percorrer cada posição da matriz e atualizar o valor que ela possui.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
arr2D_i(i, j) *= 2;
)
)
Console.WriteLine("\n\nUpdated Array (multiplied by 2)\n");
DisplayArray(arr2D_i);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Resultado

6. Excluir elementos na matriz C # 2D

Esta é uma operação complicada. Não é possível excluir um único elemento de uma matriz C # 2D verdadeira. A exclusão de um único elemento perturba as dimensões da matriz, de forma que não seria mais uma matriz. O C # não permite isso, a menos que seja uma matriz irregular.

Então qual é a solução? Excluímos a linha inteira ou a coluna inteira? Não, o C # não permitiria isso também. A matriz é fixa em tamanho quando declarada ou inicializada. Ele corrigiu bytes de memória alocados. Não podemos mudar isso em tempo de execução.

A solução aqui é criar uma nova matriz sem os elementos que queremos excluir.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) new_array = new int(2, 2);
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
int rowToDel = 2;
int colToDel = 2;
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
if(i==rowToDel)
continue;
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
if(j==colToDel)
continue;
new_array(i, j)=arr2D_i(i, j);
)
)
Console.WriteLine("\n\nArray after deleting elements\n");
DisplayArray(new_array);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Resultado

Conclusão

Assim, vimos como uma matriz 2D é implementada em C # e quais são as várias operações CRUD que podemos executar nela. Também aprendemos a diferença entre uma implementação 2D real e uma matriz irregular. Existem muito mais métodos disponíveis em C # para ajudar os desenvolvedores a trabalhar com Arrays à vontade. Verifique-os nos documentos do MSDN.

Artigos recomendados

Este é um guia para matrizes 2D em C #. Aqui discutimos o conceito de matrizes irregulares, juntamente com operações em matrizes 2D em C #. Você também pode consultar os seguintes artigos para saber mais:

  1. Matrizes 2D em Java
  2. Matrizes 2D em Python
  3. Matrizes em c #
  4. Matrizes em C ++
  5. Matrizes em PHP
  6. Gráficos 2D em Java
  7. Como matrizes e listas funcionam em Python?
  8. Matrizes multidimensionais em C ++ com exemplos
  9. Matrizes 2D em PHP