domingo, 10 de septiembre de 2017

La Clase Array en C# - Parte 2/3

Índice

1. Introducción
2. Palabras Clave
3. Búsqueda
4. Ordenamiento
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

Esta segunda entrada de artículos relacionados con la Clase Array en C# describe los métodos de búsqueda -búsqueda binaria, locativa y por predicado-, y los métodos de ordenamiento de los elementos por su orden natural o siguiendo una regla.

2. Palabras Clave

  • Array
  • Arreglo
  • Búsqueda
  • Ordenamiento

3. Búsqueda

La clase Array ofrece tres clases de métodos de búsqueda para arreglos unidimensionales (Albahari, 2012):
  • Método static sobrecargado BinarySearch ("Array.BinarySearch", 2017): busca sobre un arreglo ordenado usando el algoritmo de búsqueda binaria.
  • Búsqueda locativa: los métodos IndexOf y LastIndex recuperan el primer y último elemento de un arreglo.
  • Búsqueda por predicados: los métodos Find, FindLast, FindIndex, FindLastIndex, FindAll, Exists y TrueForAll realizan una búsqueda partiendo de un predicado lógico de tipo Predicate<T>.
Cuando no se encuentra un elemento en un arreglo usando cualquiera de los métodos de búsqueda, éstos retornan -1 o el valor por defecto del tipo paramétrico -0 para valores numéricos o null para string, por ejemplo-.

Para los métodos basados en el algoritmo de búsqueda binaria, el cual es de alto desempeño, el requisito indispensable es que los elementos estén ordenados.

Para la búsqueda locativa, se efectúa una enumeración de los elementos y se obtiene el índice del primer u último elemento que coincide con un valor particular.

A través de un delegado (Delegados en C# - Parte 1: Introducción) o una expresión lambda (Expresiones Lambda en C# - Parte 1: Introducción a las Expresiones Lambda) es posible establecer un predicado para la búsqueda de uno o más valores en un arreglo. La forma sintáctica que tiene un predicado es ("Predicate(T) Delegate", 2017):

public delegate bool Predicate<T>(T object)

Un ejemplo de uso básico podría ser:

static void Main()
{
    string[] tresMaestros = { "Balzac", "Dickens", "Dostoievski"};
    string encontrado = Array.Find(tresMaestros, ContieneO);
   
    Console.WriteLine(encontrado); // Dostoievski
}

static bool ContieneO(string escritor)
{
    return escritor.Contains("o");
}

Otra forma simplificada:

static void Main()
{
    string[] tresMaestros = { "Balzac", "Dickens", "Dostoievski"};
    string encontrado = Array.Find(tresMaestros, delegate(string escritor){return escritor.Contains("o");});
   
    Console.WriteLine(encontrado); // Dostoievski
}

Aunque con una expresión lambda se obtiene una versión más simple:

static void Main()
{
    string[] tresMaestros = { "Balzac", "Dickens", "Dostoievski"};
    string encontrado = Array.Find(tresMaestros, n => n.Contains("o"));
   
    Console.WriteLine(encontrado); // Dostoievski
}

[Nota: El lector puede leer la documentación para comprender los demás métodos que aceptan un predicado para efecutar una búsqueda.]

4. Ordenamiento

Existen 17 versiones sobrecargadas del método Sort en la Array. Una forma básica de uso sobre un único arreglo podría ser:

int[] numeros = {5, 2, 3, 7};
Array.Sort(numeros);    // {2, 3, 6, 7}

O usar la versión que acepta dos arreglos:

int[] numeros = {5, 2, 3, 7};
string[] tresMaestros = { "Dostoievski", "Dickens", "Balzac"};
Array.Sort(numeros, tresMaestros);    // {2, 3, 6, 7}, { "Balzac", "Dickens", "Dostoievski"}

Vale agregar que existen otras versiones sobrecargadas que facilitan especificar un delegado de comparación para la personlización la forma en que se debe llegar la comparación:

public delegate int Comparison<T>(T x, T y)

5. Conclusiones

Hemos explorado las formas esenciales para buscar y ordernar los elementos en una colección de tipo Array. Estos métodos comprenden operaciones fundamentales para manipular elementos de datos para solución de problemas.

El siguiente artículo se estudiará cómo revertir, copiar, convertir y redimensionar un arreglo de tipo Array.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Array Class (System) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.array%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Array.BinarySearch Method (System) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.array.binarysearch(v=vs.110).aspx
Delegados en C# - Parte 1: Introducción (2017). Recuperado desde: https://ortizol.blogspot.com/2014/05/Delegados-en-csharp-parte-1-introduccion.html
Expresiones Lambda en C# - Parte 1: Introducción a las Expresiones Lambda (2017). Recuperado desde: https://ortizol.blogspot.com/2014/06/expresiones-lambda-en-csharp-parte-1-introduccion-a-las-expresiones-lambda.html
Predicate(T) Delegate (System) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bfcke1bz.aspx?f=255&MSPPError=-2147217396


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.