domingo, 27 de marzo de 2016

Pregunta C# (18 de 20): ¿Cómo Eliminar Datos Duplicados de un Arreglo?

Índice

1. Introducción
2. Palabras Clave
3. Contexto
3.1 LINQ
3.2 List<T>
4. Eliminación de Datos Duplicados de un Arreglo
5. Recursos
6. Conclusiones
7. Literatura & Enlaces

1. Introducción

A unas pocas preguntas de terminar esta iteración de artículos C# enfocados a la resolución de preguntas comunes usando el lenguaje de programación C#. En esta ocasión se resuelve la pregunta de cómo eliminar datos duplicados de un arreglo: se presentan dos enfoques distintos: funciones de LINQ y la iteración del arreglo. Al final se muestra cuál de estos dos métodos es más eficiente en cuanto al uso de construcciones y uso de recursos de cómputo.

2. Palabras Clave

  • Arreglo
  • Colección
  • LINQ
  • Lista
  • Terna de Pitágoras

3. Contexto

3.1 LINQ

LINQ ("Language Integrated Query", 2016) -Language Integrated Query- provee una abstracción para la extracción y procesamiento de datos sobre diferentes fuentes de datos: bases de datos relacionales, XML, arreglos, tipos enumerables, objetos en memoria, entre otras más. Cuenta, además, con soporte para ORM.

Como ejemplo básico de uso de LINQ, se puede presentar el cálculo de ternas de Pitágoras:

Enumerable.Range(2, 10)
.Select(c => new {
Longitud = 2 * c,
Altura = c * c - 1,
Hipotenusa = c * c + 1
}).Dump("Ternas de Pitágoras")

Al ejecutar este código se obtiene hasta 10 ternas de Pitágoras ("Terna pitagórica", 2016) empezando con c igual a 2. La ejecución de demostración se realiza en LINQPad y su resultado es:
Ternas de Pitágoras en LINQ
Figura 1. Ternas de Pitágoras en LINQ.
Para saber más acerca de LINQ recomiendo la lectura de estas recetas LINQ (en inglés):
La clase genérica List<T> ("List(T) Class", 2016) representa una lista de objetos indezados. Esta clase contiene definiciones para la búsqueda, ordenamiento y manipulación de objetos. Se halla definida en el namespace System.Collections.Generic.

4. Eliminación de Datos Duplicados de un Arreglo

En esta solución se presentan dos mecanismos programáticos para la eliminación de elementos -datos- duplicados en un arreglo:
  • uso de LINQ, e 
  • iteración de los elementos del arreglo original
En la línea 11 se crea un arreglo de objetos string con diferentes nombres de aplicaciones (algunos duplicados). Con el método EliminarDuplicadosLinq(string[]) se hace uso de LINQ para eliminar duplicados: el método Distinct() ejecuta esta tarea de forma eficiente. Nótese que basta con una línea de código para la eliminación de datos duplicados del arreglo software.


Por otro lado, con el método EliminarDuplicadosIterativo(string[]) se usa un enfoque de eliminación de datos duplicados usando ciclos: en este caso un ciclo foreach. Además es necesario crear una colección de tipo List<string> para insertar los elementos no duplicados. Con el método Contains de esta colección se consulta si el elemento actual del arreglo software ya fue insertado en la lista.

Compilación:

csc /t:exe EliminacionDuplicados.cs

Ejecución assembly

.\EliminacionDuplicados.exe


Demostración ejecución assembly (ideone.com): 



Eliminación duplicados con LINQ:
Evernote
Chrome
TuneIn
Wolfram Alpha
Stack Exchange

Eliminación duplicados con ciclos foreach:
Evernote
Chrome
TuneIn
Wolfram Alpha
Stack Exchange


Demostración ejecución assembly (local): 
Ejecución assembly EliminacionDuplicados.exe
Figura 2. Ejecución assembly EliminacionDuplicados.exe.

5. Recursos

Este es el vídeo en donde el equipo de expertos Gerry O'Brein y Paul Pardi de MVA, responden y explican esta pregunta:

6. Conclusiones

Se usaron dos enfoques distintos para la eliminación de datos duplicados en un arreglo: a través de LINQ y ciclos. El mecanismo de LINQ es mucho más eficiente y expresivo que el basado en ciclos: a nivel de costos computacionales es más eficiente en el uso de tiempo de procesador y espacio de memoria.

En la penúltima pregunta C# se estudia cómo ordenar un diccionario por valor.

7. Literatura & Enlaces

Top C# Questions Answered | Microsoft Virtual Academy (2016, marzo 27). Recuperado desde: https://mva.microsoft.com/en-US/training-courses/twenty-c-questions-answered-8298?l=FcVUiWYy_7504984382
Language Integrated Query (2016, marzo 27). Recuperado desde: https://en.wikipedia.org/wiki/Language_Integrated_Query
LINQ Recipe No. 2-1: Mathematics and Statistics - Compute the Dot Product of Two Vectors (2016, marzo 27). Recuperado desde: http://ortizol.blogspot.com/2016/03/linq-recipe-no-2-1-mathematics-and-statistics-compute-the-dot-product-of-two-vectors.html
LINQ Recipe No. 2-2: Mathematics and Statistics - How to Generate Pythagorean Triples (2016, marzo 27). Recuperado desde: http://ortizol.blogspot.com/2016/03/linq-recipe-no-2-2-mathematics-and-statistics-how-to-generate-pythagorean-triples.html
LINQ Recipe No. 2-3: Mathematics and Statistics - How to Compute a Weighted Sum? (2016, marzo 27). Recuperado desde: http://ortizol.blogspot.com/2016/03/linq-recipe-no-2-3-mathematics-and-statistics-how-to-compute-a-weighted-sum.html
List(T) Class (System.Collections.Generic) (2016, marzo 27). Recuperado desde: https://msdn.microsoft.com/en-us/library/6sh2ey19.aspx
Terna pitagórica (2016, marzo 27). Recuperado desde: https://es.wikipedia.org/wiki/Terna_pitag%C3%B3rica


V

No hay comentarios:

Publicar un comentario

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