Saltar al pie de página
.NET AYUDA

Buscar en C# (Cómo funciona para desarrolladores)

Bienvenido a nuestro tutorial sobre la práctica función Find de C#. Acabas de encontrar una característica poderosa que puede agilizar tu proceso de codificación. Así que, ya seas un programador experimentado o estés comenzando, este tutorial te guiará a través de todos los elementos para que puedas avanzar.

Los fundamentos de Find

En su esencia, Find es una función que te permite localizar el primer elemento en una colección, arreglo o lista que satisfaga un predicado especificado. ¿Qué es un predicado, preguntas? En programación, un predicado es una función que prueba ciertas condiciones definidas para los elementos en una colección.

Ahora, profundicemos en un ejemplo de clase pública.

public class BikePart
{
    public string Id { get; set; } // Property to identify the bike part

    // Override the Equals method to specify how to compare two BikePart objects
    public override bool Equals(object obj)
    {
        if (obj == null || !(obj is BikePart))
            return false;

        return this.Id == ((BikePart)obj).Id;
    }

    // Override GetHashCode for hashing BikePart objects
    public override int GetHashCode()
    {
        return this.Id.GetHashCode();
    }

    // Override ToString to return a custom string representation of the object
    public override string ToString()
    {
        return "BikePart ID: " + this.Id;
    }
}
public class BikePart
{
    public string Id { get; set; } // Property to identify the bike part

    // Override the Equals method to specify how to compare two BikePart objects
    public override bool Equals(object obj)
    {
        if (obj == null || !(obj is BikePart))
            return false;

        return this.Id == ((BikePart)obj).Id;
    }

    // Override GetHashCode for hashing BikePart objects
    public override int GetHashCode()
    {
        return this.Id.GetHashCode();
    }

    // Override ToString to return a custom string representation of the object
    public override string ToString()
    {
        return "BikePart ID: " + this.Id;
    }
}
$vbLabelText   $csharpLabel

En este código, BikePart es nuestra clase pública, y contiene un ID de cadena pública para identificar cada parte de la bicicleta. Hemos sobrescrito el método ToString para imprimir el ID de la parte de la bicicleta de manera adecuada, y también hemos sobrescrito los métodos Equals y GetHashCode para propósitos de comparación.

Empleando Find con predicados

Ahora que tenemos nuestra clase BikePart, podemos crear una lista de partes de bicicleta y usar Find para ubicar partes específicas en función de sus IDs. Consideremos el siguiente ejemplo:

using System;
using System.Collections.Generic;

public static void Main()
{
    // Create a list of BikePart objects
    List<BikePart> bikeParts = new List<BikePart>
    {
        new BikePart { Id = "Chain Ring ID" },
        new BikePart { Id = "Crank Arm ID" },
        new BikePart { Id = "Regular Seat ID" },
        new BikePart { Id = "Banana Seat ID" },
    };

    // Define a predicate to find a BikePart with a specific ID
    Predicate<BikePart> findChainRingPredicate = (BikePart bp) => { return bp.Id == "Chain Ring ID"; };
    BikePart chainRingPart = bikeParts.Find(findChainRingPredicate);

    // Print the found BikePart's ID to the console
    Console.WriteLine(chainRingPart.ToString());
}
using System;
using System.Collections.Generic;

public static void Main()
{
    // Create a list of BikePart objects
    List<BikePart> bikeParts = new List<BikePart>
    {
        new BikePart { Id = "Chain Ring ID" },
        new BikePart { Id = "Crank Arm ID" },
        new BikePart { Id = "Regular Seat ID" },
        new BikePart { Id = "Banana Seat ID" },
    };

    // Define a predicate to find a BikePart with a specific ID
    Predicate<BikePart> findChainRingPredicate = (BikePart bp) => { return bp.Id == "Chain Ring ID"; };
    BikePart chainRingPart = bikeParts.Find(findChainRingPredicate);

    // Print the found BikePart's ID to the console
    Console.WriteLine(chainRingPart.ToString());
}
$vbLabelText   $csharpLabel

En este código, instanciamos cuatro objetos BikePart con IDs únicos. A continuación, creamos un predicado findChainRingPredicate que verifica si una parte de la bicicleta tiene el ID "Chain Ring ID". Finalmente, llamamos a Find en nuestra lista de partes de bicicleta usando el predicado que definimos y mostramos el ID de la parte encontrada en la consola.

Comprensión del parámetro predicado

Puede que te estés preguntando sobre el parámetro Predicate match en nuestro método Find. Aquí es donde defines las condiciones bajo las cuales el método Find devuelve un elemento. En nuestro caso, queríamos que el método Find devolviera el primer elemento que coincide con el "Chain Ring ID".

Si ningún elemento satisface las condiciones definidas en tu predicado, el método Find devolverá un valor predeterminado. Por ejemplo, si estás trabajando con un arreglo de enteros y tu predicado no encuentra una coincidencia, el método Find devolverá '0', el valor predeterminado para enteros en C#.

El principio de búsqueda lineal

Es esencial notar que la función Find realiza una búsqueda lineal a través de toda la matriz, lista o colección. Esto significa que comienza en el primer elemento y examina cada elemento siguiente en secuencia hasta que localiza la primera ocurrencia de un elemento que satisface el predicado.

En algunos casos, podrías querer localizar el último elemento que satisface el predicado en lugar del primero. Para este propósito, C# proporciona la función FindLast.

FindIndex y FindLastIndex

Así como Find te ayuda a localizar la primera ocurrencia de un elemento que coincide con tu predicado especificado, C# también proporciona los métodos FindIndex y FindLastIndex para darte los índices de los primeros y últimos elementos que coinciden con tus condiciones, respectivamente.

Probemos un ejemplo:

using System;
using System.Collections.Generic;

public static void Main()
{
    // Create a list of BikePart objects with an additional duplicate entry
    List<BikePart> bikeParts = new List<BikePart>
    {
        new BikePart { Id = "Chain Ring ID" },
        new BikePart { Id = "Crank Arm ID" },
        new BikePart { Id = "Regular Seat ID" },
        new BikePart { Id = "Banana Seat ID" },
        new BikePart { Id = "Chain Ring ID" }, // Added a second chain ring
    };

    // Define a predicate to find a BikePart with a specific ID
    Predicate<BikePart> findChainRingPredicate = (BikePart bp) => { return bp.Id == "Chain Ring ID"; };

    // Find the index of the first and last occurrence of the specified BikePart
    int firstChainRingIndex = bikeParts.FindIndex(findChainRingPredicate);
    int lastChainRingIndex = bikeParts.FindLastIndex(findChainRingPredicate);

    // Print the indices to the console
    Console.WriteLine($"First Chain Ring ID found at index: {firstChainRingIndex}");
    Console.WriteLine($"Last Chain Ring ID found at index: {lastChainRingIndex}");
}
using System;
using System.Collections.Generic;

public static void Main()
{
    // Create a list of BikePart objects with an additional duplicate entry
    List<BikePart> bikeParts = new List<BikePart>
    {
        new BikePart { Id = "Chain Ring ID" },
        new BikePart { Id = "Crank Arm ID" },
        new BikePart { Id = "Regular Seat ID" },
        new BikePart { Id = "Banana Seat ID" },
        new BikePart { Id = "Chain Ring ID" }, // Added a second chain ring
    };

    // Define a predicate to find a BikePart with a specific ID
    Predicate<BikePart> findChainRingPredicate = (BikePart bp) => { return bp.Id == "Chain Ring ID"; };

    // Find the index of the first and last occurrence of the specified BikePart
    int firstChainRingIndex = bikeParts.FindIndex(findChainRingPredicate);
    int lastChainRingIndex = bikeParts.FindLastIndex(findChainRingPredicate);

    // Print the indices to the console
    Console.WriteLine($"First Chain Ring ID found at index: {firstChainRingIndex}");
    Console.WriteLine($"Last Chain Ring ID found at index: {lastChainRingIndex}");
}
$vbLabelText   $csharpLabel

El poder de FindAll

El método FindAll, como su nombre sugiere, recupera todos los elementos en la colección que satisfacen el predicado. Se utiliza cuando necesitas filtrar elementos basados en ciertas condiciones. El método FindAll devuelve una nueva Lista con todos los elementos que coinciden.

Aquí hay un ejemplo de código:

using System;
using System.Collections.Generic;

public static void Main()
{
    // Create a list of BikePart objects with an additional duplicate entry
    List<BikePart> bikeParts = new List<BikePart>
    {
        new BikePart { Id = "Chain Ring ID" },
        new BikePart { Id = "Crank Arm ID" },
        new BikePart { Id = "Regular Seat ID" },
        new BikePart { Id = "Banana Seat ID" },
        new BikePart { Id = "Chain Ring ID" }, // Added a second chain ring
    };

    // Define a predicate to find all BikeParts with a specific ID
    Predicate<BikePart> findChainRingPredicate = (BikePart bp) => { return bp.Id == "Chain Ring ID"; };

    // Use FindAll to get all matching BikePart objects
    List<BikePart> chainRings = bikeParts.FindAll(findChainRingPredicate);

    // Print the count and details of each found BikePart
    Console.WriteLine($"Found {chainRings.Count} Chain Rings:");
    foreach (BikePart chainRing in chainRings)
    {
        Console.WriteLine(chainRing.ToString());
    }
}
using System;
using System.Collections.Generic;

public static void Main()
{
    // Create a list of BikePart objects with an additional duplicate entry
    List<BikePart> bikeParts = new List<BikePart>
    {
        new BikePart { Id = "Chain Ring ID" },
        new BikePart { Id = "Crank Arm ID" },
        new BikePart { Id = "Regular Seat ID" },
        new BikePart { Id = "Banana Seat ID" },
        new BikePart { Id = "Chain Ring ID" }, // Added a second chain ring
    };

    // Define a predicate to find all BikeParts with a specific ID
    Predicate<BikePart> findChainRingPredicate = (BikePart bp) => { return bp.Id == "Chain Ring ID"; };

    // Use FindAll to get all matching BikePart objects
    List<BikePart> chainRings = bikeParts.FindAll(findChainRingPredicate);

    // Print the count and details of each found BikePart
    Console.WriteLine($"Found {chainRings.Count} Chain Rings:");
    foreach (BikePart chainRing in chainRings)
    {
        Console.WriteLine(chainRing.ToString());
    }
}
$vbLabelText   $csharpLabel

Presentación de IronPDF

Un área crucial donde nuestro conocimiento del C# Find puede ser utilizado es la manipulación de contenido PDF usando IronPDF, una potente biblioteca C# para el procesamiento de PDF.

Supongamos que estamos trabajando con un documento PDF que contiene información sobre varias partes de bicicleta. A menudo, necesitamos localizar partes específicas dentro de este contenido. Aquí es donde IronPDF y el método C# Find se combinan para proporcionar una solución poderosa.

Primero, usaríamos IronPDF para extraer el texto de nuestro PDF y luego podemos usar el método Find o FindAll que hemos aprendido antes para localizar la parte específica en el texto extraído.

using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        // Load and extract text from a PDF document
        PdfDocument pdf = PdfDocument.FromFile(@"C:\Users\Administrator\Desktop\bike.pdf");
        string pdfText = pdf.ExtractAllText();

        // Split the extracted text into lines
        List<string> pdfLines = pdfText.Split('\n').ToList();

        // Define a predicate to find lines that contain a specific text
        Predicate<string> findChainRingPredicate = (string line) => { return line.Contains("Chain Ring ID"); };

        // Use FindAll to get all lines containing the specified text
        List<string> chainRingLines = pdfLines.FindAll(findChainRingPredicate);

        // Print the count and content of each found line
        Console.WriteLine($"Found {chainRingLines.Count} lines mentioning 'Chain Ring ID':");
        foreach (string line in chainRingLines)
        {
            Console.WriteLine(line);
        }
    }
}
using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        // Load and extract text from a PDF document
        PdfDocument pdf = PdfDocument.FromFile(@"C:\Users\Administrator\Desktop\bike.pdf");
        string pdfText = pdf.ExtractAllText();

        // Split the extracted text into lines
        List<string> pdfLines = pdfText.Split('\n').ToList();

        // Define a predicate to find lines that contain a specific text
        Predicate<string> findChainRingPredicate = (string line) => { return line.Contains("Chain Ring ID"); };

        // Use FindAll to get all lines containing the specified text
        List<string> chainRingLines = pdfLines.FindAll(findChainRingPredicate);

        // Print the count and content of each found line
        Console.WriteLine($"Found {chainRingLines.Count} lines mentioning 'Chain Ring ID':");
        foreach (string line in chainRingLines)
        {
            Console.WriteLine(line);
        }
    }
}
$vbLabelText   $csharpLabel

En este código, hemos cargado un PDF, extraído el texto, dividido en líneas, y luego usado FindAll para localizar todas las líneas que mencionan el 'Chain Ring ID'.

Cómo Ver Archivos PDF en VB.NET: Figura 1

Este es un ejemplo básico de cómo el método Find puede ser utilizado junto con IronPDF en un escenario práctico. Demuestra la utilidad y versatilidad de C# junto con sus poderosas bibliotecas que ayudan a hacer tus tareas de programación más fáciles y eficientes.

Conclusión

En este tutorial, profundizamos en el método Find de C# y sus parientes, FindIndex, FindLastIndex, y FindAll. Exploramos sus usos, examinamos algunos ejemplos de código, y descubrimos las circunstancias donde son más efectivos.

También nos adentramos en el mundo de la manipulación de PDF usando la biblioteca IronPDF. Asimismo, vimos una aplicación práctica de nuestro conocimiento del método Find en la extracción y búsqueda de contenido dentro de un documento PDF.

IronPDF ofrece una prueba gratuita de IronPDF, brindando una excelente oportunidad para explorar sus funcionalidades y determinar cómo puede beneficiar a tus proyectos en C#. Si decides continuar usando IronPDF después de la prueba, las licencias comienzan desde $799.

Preguntas Frecuentes

¿Cómo funciona la función Buscar de C# para los desarrolladores?

La función Buscar de C# permite a los desarrolladores localizar el primer elemento en una colección, matriz o lista que cumpla condiciones específicas definidas por un predicado. Esta función es útil para optimizar el proceso de codificación.

¿Qué es un predicado y cómo se utiliza en C#?

Un predicado en C# es un delegado que representa un método con una condición específica. Se usa en métodos como Buscar para probar cada elemento en una colección, devolviendo aquellos que cumplen los criterios.

¿Puedo usar el método Buscar con una clase personalizada en C#?

Sí, puedes usar el método Buscar con una clase personalizada definiendo un predicado que coincida con los criterios de búsqueda para los elementos de la clase, como encontrar un objeto con un valor de propiedad específico.

¿Qué sucede si ningún elemento coincide con los criterios en el método Buscar?

Si ningún elemento coincide con los criterios especificados por el predicado en el método Buscar, devuelve un valor por defecto, como null para tipos de referencia o 0 para tipos de valor.

¿Cuáles son las diferencias entre Buscar y BuscarTodo en C#?

El método Buscar devuelve el primer elemento que coincide con el predicado, mientras que BuscarTodo devuelve una lista de todos los elementos que satisfacen las condiciones del predicado.

¿Cómo difieren los métodos BuscarÍndice y BuscarÚltimoÍndice?

BuscarÍndice devuelve el índice del primer elemento que coincide con el predicado, mientras que BuscarÚltimoÍndice devuelve el índice del último elemento que coincide con los criterios.

¿Cómo puedo integrar una biblioteca PDF con Buscar de C# para buscar texto?

Al utilizar una biblioteca PDF, puedes extraer texto de PDFs y utilizar el método Buscar para buscar contenido específico dentro del texto, haciéndolo efectivo para el procesamiento de documentos.

¿Es posible buscar elementos por sus propiedades usando Buscar?

Sí, puedes definir un predicado basado en las propiedades de los elementos para buscar criterios específicos, como localizar un objeto con un ID o atributo particular.

¿Qué tan eficiente es el método Buscar para colecciones de datos grandes?

El método Buscar realiza una búsqueda lineal, verificando cada elemento secuencialmente. Aunque sencillo, puede no ser el más eficiente para colecciones muy grandes debido a su complejidad O(n).

¿Qué beneficios ofrece una biblioteca PDF para los desarrolladores de C#?

Una biblioteca PDF proporciona capacidades robustas de manejo de PDF, lo que permite a los desarrolladores extraer, manipular y buscar contenido PDF fácilmente usando C#, mejorando así la eficiencia de las tareas relacionadas con documentos.

Jacob Mellor, Director de Tecnología @ Team Iron
Director de Tecnología

Jacob Mellor es Director de Tecnología en Iron Software y un ingeniero visionario que lidera la tecnología PDF en C#. Como el desarrollador original detrás de la base de código central de Iron Software, ha moldeado la arquitectura de productos de la compañía desde ...

Leer más