4 MATRICES

Una matriz es una estructura de datos que contiene una serie de variables del mismo tipo. Las matrices se declaran con un tipo:

type[] arrayName;

 

Los ejemplos siguientes crean matrices unidimensionales, multidimensionales y escalonadas:

 

class TestArraysClass

{                    

static void Main()

{

// Declare a single-dimensional array

int[] array1 = new int[5];

 

// Declare and set array element values

int[] array2 = new int[] { 1, 3, 5, 7, 9 };

 

// Alternative syntax

int[] array3 = { 1, 2, 3, 4, 5, 6 };

 

// Declare a two dimensional array

int[,] multiDimensionalArray1 = new int[2, 3];

 

// Declare and set array element values

int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };

 

// Declare a jagged array

int[][] jaggedArray = new int[6][];

 

// Set the values of the first array in the jagged array structure

jaggedArray[0] = new int[4] { 1, 2, 3, 4 };

}

} 

 

Información general sobre las matrices

 

Una matriz tiene las propiedades siguientes:

 

  • Una matriz puede ser unidimensional, multidimensional o escalonada.
  • El valor predeterminado de los elementos numéricos de matriz se establece en cero y el de los elementos de referencia se establece en null.
  • Una matriz escalonada es una matriz de matrices y por consiguiente sus elementos son tipos de referencia y se inicializan en null.
  • Las matrices se indizan basadas en cero: una matriz con n elementos se indiza desde 0 hasta n-1.
  • Los elementos de una matriz pueden ser de cualquier tipo, incluido el tipo matriz.
  • Los tipos de matriz son tipos de referencia derivados del tipo base abstracto Array. Puesto que este tipo implementa IEnumerable e IEnumerable, puede utilizar la iteración foreach en todas las matrices de C#.

 

 

  • Utilizar matrices como objetos (Guía de programación de C#)
  • Utilizar foreach son matrices (Guía de programación de C#)
  • Pasar matrices como parámetros (Guía de programación de C#)
  • Pasar matrices mediante Ref y Out (Guía de programación de C#)
  • Ejemplo Arrays

4.1.- UTILIZAR MATRICES COMO OBJETOS

 

En C#, las matrices son de hecho objetos, y no simplemente regiones direccionables de memoria contigua como ocurre en C y C++. Array es el tipo base abstracto de todos los tipos de matriz. Las propiedades y otros miembros de la clase Array se pueden utilizar cuando sea necesario. Un ejemplo de esto sería utilizar la propiedad Lengthpara obtener la longitud de una matriz. El siguiente código asigna la longitud de la matriz numbers, que es 5, a una variable denominada lengthOfNumbers:

 

int[] numbers = { 1, 2, 3, 4, 5 };

int lengthOfNumbers = numbers.Length; 

 

La clase System.Array proporciona muchos otros métodos y propiedades útiles para ordenar, buscar y copiar matrices.

 

Ejemplo

En este ejemplo se utiliza la propiedad Rank para mostrar el número de dimensiones de una matriz.

 

class TestArraysClass

{

static void Main()

{

// Declare and initialize an array:

int[,] theArray = new int[5, 10];

System.Console.WriteLine(“The array has {0} dimensions.”, theArray.Rank);

}

} 

 

Resultado

The array has 2 dimensions.

 

 

4.2.- UTILIZAR FOREACH

 

C# dispone de la instrucción foreach. Esta instrucción proporciona un modo simple y limpio de recorrer en iteración los elementos de una matriz. Por ejemplo, el siguiente código crea una matriz denominada numbers y la recorre mediante la instrucción foreach:

 

int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };

foreach (int i in numbers)

{

System.Console.WriteLine(i);

} 

 

Con matrices multidimensionales, se puede utilizar el mismo método para recorrer los elementos, por ejemplo:

 

int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };

foreach (int i in numbers2D)

{

System.Console.Write(“{0} “, i);

} 

 

El resultado de este ejemplo es:

9 99 3 33 5 55

 

Sin embargo, con matrices multidimensionales, utilizar un bucle for anidado proporciona más control sobre los elementos de la matriz.

4.3.- PASAR MATRICES COMO PARÁMETROS

 

Las matrices se pueden pasar a los métodos como parámetros. Cuando las matrices son tipos de referencia, el método puede cambiar el valor de los elementos.

 

Pasar matrices unidimensionales como parámetros

Una matriz unidimensional inicializada se puede pasar a un método. Por ejemplo:

 

PrintArray(theArray); 

 

El método llamado en la línea anterior se podría definir como:

 

void PrintArray(int[] arr)

{

// method code

} 

 

Asimismo, es posible inicializar y pasar una matriz en una sola operación. Por ejemplo:

 

PrintArray(new int[] { 1, 3, 5, 7, 9 }); 

 

Ejemplo 1

En el siguiente ejemplo, una matriz de cadena se inicializa y se pasa como parámetro al método PrintArray, el cual muestra los elementos de la matriz:

 

class ArrayClass

{

static void PrintArray(string[] arr)

{

for (int i = 0; i < arr.Length; i++)

{

System.Console.Write(arr[i] + “{0}”, i < arr.Length – 1 ? ” ” : “”);

}

System.Console.WriteLine();

}

 

static void Main()

{

// Declare and initialize an array:

string[] weekDays = new string[] { “Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat” };

 

// Pass the array as a parameter:

PrintArray(weekDays);

}

} 

 

 

Resultado 1

Sun Mon Tue Wed Thu Fri Sat

 

Pasar matrices multidimensionales como parámetros

Una matriz multidimensional inicializada se puede pasar a un método. Por ejemplo, si theArray es una matriz bidimensional:

 

PrintArray(theArray);

 

El método llamado en la línea anterior se podría definir como:

 

void PrintArray(int[,] arr)

{

// method code

} 

 

Asimismo, es posible inicializar y pasar una matriz en una sola operación. Por ejemplo:

 

PrintArray(new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } });

 

 

Ejemplo 2

En el siguiente ejemplo, una matriz bidimensional de cadena se inicializa y se pasa como parámetro al método PrintArray, el cual muestra los elementos de la matriz:

 

class ArrayClass2D

{

static void PrintArray(int[,] arr)

{

// Display the array elements:

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 2; j++)

{

System.Console.WriteLine(“Element({0},{1})={2}”, i, j, arr[i, j]);

}

}

}

static void Main()

{

// Pass the array as a parameter:

PrintArray(new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } });

}

} 

 

 

Element(0,0)=1

Element(0,1)=2

Element(1,0)=3

Element(1,1)=4

Element(2,0)=5

Element(2,1)=6

Element(3,0)=7

Element(3,1)=8

4.4.- PASAR MATRICES MEDIANTE REF Y OUT

 

Al igual que todos los parámetros out, un parámetro out de tipo de matriz debe asignarse antes de utilizarlo; es decir, debe asignarlo el destinatario. Por ejemplo:

 

static void TestMethod1(out int[] arr)

{

arr = new int[10]; // definite assignment of arr

} 

 

Al igual que todos los parámetros ref, un parámetro ref de tipo de matriz debe asignarlo el llamador. Por consiguiente, no es necesario que lo asigne el destinatario. Un parámetro ref de un tipo de matriz puede cambiar como resultado de la llamada. Por ejemplo, a la matriz se le puede asignar el valor null o se puede inicializar con otra matriz. Por ejemplo:

 

static void TestMethod2(ref int[] arr)

{

arr = new int[10]; // arr initialized to a different array

} 

 

Los dos ejemplos siguientes muestran la diferencia entre out y ref cuando se utilizan para pasar matrices a métodos.

 

Ejemplo 1

En este ejemplo, la matriz theArray se declara en el llamador (el método Main) y se inicializa en el método FillArray. A continuación, los elementos de la matriz se devuelven al método que realizó la llamada y se muestran.

 

class TestOut

{

static void FillArray(out int[] arr)

{

// Initialize the array:

arr = new int[5] { 1, 2, 3, 4, 5 };

}

 

static void Main()

{

int[] theArray; // Initialization is not required

 

// Pass the array to the callee using out:

FillArray(out theArray);

 

// Display the array elements:

System.Console.WriteLine(“Array elements are:”);

for (int i = 0; i < theArray.Length; i++)

{

System.Console.Write(theArray[i] + ” “);

}

}

} 

 

Resultado 1

Array elements are:

1 2 3 4 5

 

Ejemplo 2

En este ejemplo, la matriz theArray se inicializa en el llamador (el método Main) y se pasa al método FillArray mediante el parámetro ref. Algunos de los elementos de la matriz se actualizan en el método FillArray. A continuación, los elementos de la matriz se devuelven al método que realizó la llamada y se muestran.

 

class TestRef

{

static void FillArray(ref int[] arr)

{

// Create the array on demand:

if (arr == null)

{

arr = new int[10];

}

// Fill the array:

arr[0] = 1111;

arr[4] = 5555;

}

 

static void Main()

{

// Initialize the array:

int[] theArray = { 1, 2, 3, 4, 5 };

 

// Pass the array using ref:

FillArray(ref theArray);

 

// Display the updated array:

System.Console.WriteLine(“Array elements are:”);

for (int i = 0; i < theArray.Length; i++)

{

System.Console.Write(theArray[i] + ” “);

}

}

} 

 

Resultado 2

Array elements are:

1111 2 3 4 5555