Przejdź do treści stopki
POMOC .NET

C# Find (jak to działa dla programistów)

Witamy w naszym samouczku poświęconym przydatnej funkcji Find w języku C#. Właśnie natrafiłeś na potężną funkcję, która może usprawnić proces kodowania. Niezależnie od tego, czy jesteś doświadczonym programistą, czy dopiero zaczynasz, ten samouczek przeprowadzi Cię przez wszystkie elementy niezbędne do rozpoczęcia pracy.

Podstawy wyszukiwania

W swej istocie Find jest funkcją, która pozwala zlokalizować pierwszy element w kolekcji, tablicy lub liście, który spełnia określony warunek. Czym jest predykat, pytasz? W programowaniu predykat to funkcja, która sprawdza określone warunki zdefiniowane dla elementów w zbiorze.

Przejdźmy teraz do przykładu klasy publicznej.

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;
    }
}
Public Class BikePart
	Public Property Id() As String ' -  Property to identify the bike part

	' Override the Equals method to specify how to compare two BikePart objects
	Public Overrides Function Equals(ByVal obj As Object) As Boolean
		If obj Is Nothing OrElse Not (TypeOf obj Is BikePart) Then
			Return False
		End If

		Return Me.Id = DirectCast(obj, BikePart).Id
	End Function

	' Override GetHashCode for hashing BikePart objects
	Public Overrides Function GetHashCode() As Integer
		Return Me.Id.GetHashCode()
	End Function

	' Override ToString to return a custom string representation of the object
	Public Overrides Function ToString() As String
		Return "BikePart ID: " & Me.Id
	End Function
End Class
$vbLabelText   $csharpLabel

W tym kodzie BikePart jest naszą klasą publiczną i zawiera publiczny identyfikator typu string służący do identyfikacji każdej części rowerowej. Zastąpiliśmy metodę ToString, aby ładnie wydrukować identyfikator części rowerowej, a także zastąpiliśmy metody Equals i GetHashCode w celach porównawczych.

Wykorzystanie funkcji Find z predykatami

Teraz, gdy mamy już naszą klasę BikePart, możemy utworzyć listę części rowerowych i użyć Find do zlokalizowania konkretnych części na podstawie ich identyfikatorów. Rozważmy następujący przykład:

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());
}
Imports System
Imports System.Collections.Generic

Public Shared Sub Main()
	' Create a list of BikePart objects
	Dim bikeParts As New List(Of BikePart) From {
		New BikePart With {.Id = "Chain Ring ID"},
		New BikePart With {.Id = "Crank Arm ID"},
		New BikePart With {.Id = "Regular Seat ID"},
		New BikePart With {.Id = "Banana Seat ID"}
	}

	' Define a predicate to find a BikePart with a specific ID
	Dim findChainRingPredicate As Predicate(Of BikePart) = Function(bp As BikePart)
		Return bp.Id = "Chain Ring ID"
	End Function
	Dim chainRingPart As BikePart = bikeParts.Find(findChainRingPredicate)

	' Print the found BikePart's ID to the console
	Console.WriteLine(chainRingPart.ToString())
End Sub
$vbLabelText   $csharpLabel

W tym kodzie tworzymy cztery obiekty BikePart z unikalnymi identyfikatorami. Następnie tworzymy predykat findChainRingPredicate, który sprawdza, czy część rowerowa ma identyfikator "Chain Ring ID". Na koniec wywołujemy Find na naszej liście części rowerowych, używając zdefiniowanego przez nas predykatu, i PRINTujemy identyfikator znalezionej części na konsoli.

Zrozumienie parametru predykatu

Być może zastanawiasz się nad parametrem dopasowania predykatu w naszej metodzie Find. W tym miejscu definiuje się warunki, na podstawie których metoda Find zwraca element. W naszym przypadku chcieliśmy, aby metoda Find zwracała pierwszy element pasujący do "Chain Ring ID".

Jeśli żaden element nie spełnia warunków zdefiniowanych w predykacie, metoda Find zwróci wartość domyślną. Na przykład, jeśli pracujesz z tablicą liczb całkowitych, a twój predykat nie znajdzie dopasowania, metoda Find zwróci "0", czyli wartość domyślną dla liczb całkowitych w języku C#.

Zasada wyszukiwania liniowego

Należy pamiętać, że funkcja Find przeprowadza liniowe przeszukiwanie całej tablicy, listy lub kolekcji. Oznacza to, że zaczyna od pierwszego elementu i sprawdza kolejno każdy następny element, aż zlokalizuje pierwsze wystąpienie elementu spełniającego warunek.

W niektórych przypadkach może być konieczne zlokalizowanie ostatniego elementu spełniającego warunek, a nie pierwszego. W tym celu język C# udostępnia funkcję FindLast.

FindIndex i FindLastIndex

Podobnie jak Find pomaga zlokalizować pierwsze wystąpienie elementu pasującego do określonego predykatu, język C# udostępnia również metody FindIndex i FindLastIndex, które zwracają odpowiednio indeksy pierwszego i ostatniego elementu spełniającego podane warunki.

Spróbujmy na przykładzie:

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}");
}
Imports System
Imports System.Collections.Generic

Public Shared Sub Main()
	' Create a list of BikePart objects with an additional duplicate entry
	Dim bikeParts As New List(Of BikePart) From {
		New BikePart With {.Id = "Chain Ring ID"},
		New BikePart With {.Id = "Crank Arm ID"},
		New BikePart With {.Id = "Regular Seat ID"},
		New BikePart With {.Id = "Banana Seat ID"},
		New BikePart With {.Id = "Chain Ring ID"}
	}

	' Define a predicate to find a BikePart with a specific ID
	Dim findChainRingPredicate As Predicate(Of BikePart) = Function(bp As BikePart)
		Return bp.Id = "Chain Ring ID"
	End Function

	' Find the index of the first and last occurrence of the specified BikePart
	Dim firstChainRingIndex As Integer = bikeParts.FindIndex(findChainRingPredicate)
	Dim lastChainRingIndex As Integer = 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}")
End Sub
$vbLabelText   $csharpLabel

Moc FindAll

Metoda FindAll, jak sama nazwa wskazuje, pobiera wszystkie elementy z kolekcji, które spełniają warunek. Służy do filtrowania elementów na podstawie określonych warunków. Metoda FindAll zwraca nową listę zawierającą wszystkie dopasowane elementy.

Oto przykładowy kod:

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());
    }
}
Imports System
Imports System.Collections.Generic

Public Shared Sub Main()
	' Create a list of BikePart objects with an additional duplicate entry
	Dim bikeParts As New List(Of BikePart) From {
		New BikePart With {.Id = "Chain Ring ID"},
		New BikePart With {.Id = "Crank Arm ID"},
		New BikePart With {.Id = "Regular Seat ID"},
		New BikePart With {.Id = "Banana Seat ID"},
		New BikePart With {.Id = "Chain Ring ID"}
	}

	' Define a predicate to find all BikeParts with a specific ID
	Dim findChainRingPredicate As Predicate(Of BikePart) = Function(bp As BikePart)
		Return bp.Id = "Chain Ring ID"
	End Function

	' Use FindAll to get all matching BikePart objects
	Dim chainRings As List(Of BikePart) = bikeParts.FindAll(findChainRingPredicate)

	' Print the count and details of each found BikePart
	Console.WriteLine($"Found {chainRings.Count} Chain Rings:")
	For Each chainRing As BikePart In chainRings
		Console.WriteLine(chainRing.ToString())
	Next chainRing
End Sub
$vbLabelText   $csharpLabel

Wprowadzenie IronPDF do obrazu

Kluczowym obszarem, w którym można wykorzystać naszą wiedzę na temat C#, jest manipulowanie treścią plików PDF przy użyciu IronPDF, potężnej biblioteki C# do przetwarzania plików PDF.

Załóżmy, że pracujemy z dokumentem PDF zawierającym informacje o różnych częściach rowerowych. Często musimy zlokalizować konkretne fragmenty w tej treści. W tym miejscu IronPDF i metoda Find języka C# łączą się, tworząc potężne rozwiązanie.

Najpierw użyjemy IronPDF do wyodrębnienia tekstu z naszego pliku PDF, a następnie możemy skorzystać z metody Find lub FindAll, o której dowiedzieliśmy się wcześniej, aby zlokalizować konkretną część w wyodrębnionym tekście.

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);
        }
    }
}
Imports Microsoft.VisualBasic
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Linq

Public Class Program
	Public Shared Sub Main()
		' Load and extract text from a PDF document
		Dim pdf As PdfDocument = PdfDocument.FromFile("C:\Users\Administrator\Desktop\bike.pdf")
		Dim pdfText As String = pdf.ExtractAllText()

		' Split the extracted text into lines
		Dim pdfLines As List(Of String) = pdfText.Split(ControlChars.Lf).ToList()

		' Define a predicate to find lines that contain a specific text
		Dim findChainRingPredicate As Predicate(Of String) = Function(line As String)
			Return line.Contains("Chain Ring ID")
		End Function

		' Use FindAll to get all lines containing the specified text
		Dim chainRingLines As List(Of String) = pdfLines.FindAll(findChainRingPredicate)

		' Print the count and content of each found line
		Console.WriteLine($"Found {chainRingLines.Count} lines mentioning 'Chain Ring ID':")
		For Each line As String In chainRingLines
			Console.WriteLine(line)
		Next line
	End Sub
End Class
$vbLabelText   $csharpLabel

W tym kodzie załadowaliśmy plik PDF, wyodrębniliśmy tekst, podzieliliśmy go na wiersze, a następnie użyliśmy FindAll, aby zlokalizować wszystkie wiersze zawierające frazę "Chain Ring ID".

Jak wyświetlać pliki PDF w VB.NET: Rysunek 1

Jest to podstawowy przykład tego, jak metoda Find może być wykorzystana wraz z IronPDF w praktycznym scenariuszu. Pokazuje użyteczność i wszechstronność języka C# wraz z jego potężnymi bibliotekami, które pomagają uczynić zadania programistyczne łatwiejszymi i bardziej wydajnymi.

Wnioski

W tym samouczku zagłębiliśmy się w metodę C# Find i jej odpowiedniki: FindIndex, FindLastIndex oraz FindAll. Zbadaliśmy ich zastosowania, przeanalizowaliśmy kilka przykładów kodu i odkryliśmy okoliczności, w których są one najbardziej skuteczne.

Zajęliśmy się również obróbką plików PDF przy użyciu biblioteki IronPDF. Podobnie widzieliśmy praktyczne zastosowanie naszej wiedzy na temat metody Find w zakresie wyodrębniania i wyszukiwania treści w dokumencie PDF.

IronPDF oferuje bezpłatną wersję próbną IronPDF, co stanowi doskonałą okazję do zapoznania się z jego funkcjonalnościami i określenia, w jaki sposób może on przynieść korzyści Twoim projektom w języku C#. Jeśli zdecydujesz się kontynuować korzystanie z IronPDF po zakończeniu okresu próbnego, ceny licencji zaczynają się od $799.

Często Zadawane Pytania

Jak działa funkcja Find w języku C# dla programistów?

Funkcja Find w języku C# pozwala programistom zlokalizować pierwszy element w kolekcji, tablicy lub liście, który spełnia określone warunki zdefiniowane przez predykat. Ta funkcja jest przydatna do usprawnienia procesu kodowania.

Czym jest predykat i jak się go używa w języku C#?

Predykat w języku C# to delegat reprezentujący metodę z określonym warunkiem. Jest on używany w metodach takich jak Find do sprawdzania każdego elementu w kolekcji i zwracania tych, które spełniają kryteria.

Czy mogę używać metody Find z klasą niestandardową w języku C#?

Tak, można użyć metody Find z klasą niestandardową, definiując predykat, który odpowiada kryteriom wyszukiwania dla elementów tej klasy, np. wyszukiwanie obiektu o określonej wartości właściwości.

Co się stanie, jeśli żadne elementy nie spełniają kryteriów w metodzie Find?

Jeśli żadne elementy nie spełniają kryteriów określonych przez predykat w metodzie Find, zwraca ona wartość domyślną, taką jak null dla typów referencyjnych lub 0 dla typów wartościowych.

Jakie są różnice między Find a FindAll w języku C#?

Metoda Find zwraca pierwszy element, który pasuje do predykatu, natomiast FindAll zwraca listę wszystkich elementów spełniających warunki predykatu.

Czym różnią się metody FindIndex i FindLastIndex?

FindIndex zwraca indeks pierwszego elementu, który spełnia warunek, natomiast FindLastIndex zwraca indeks ostatniego elementu, który spełnia kryteria.

Jak zintegrować bibliotekę PDF z funkcją wyszukiwania tekstu w języku C#?

Korzystając z biblioteki PDF, można wyodrębniać tekst z plików PDF i wykorzystywać metodę Find do wyszukiwania konkretnych treści w tekście, co sprawia, że jest ona skuteczna w przetwarzaniu dokumentów.

Czy można wyszukiwać elementy według ich właściwości za pomocą funkcji Find?

Tak, można zdefiniować predykat na podstawie właściwości elementu, aby wyszukiwać konkretne kryteria, takie jak lokalizacja obiektu o określonym identyfikatorze lub atrybucie.

Jak wydajna jest metoda Find w przypadku dużych zbiorów danych?

Metoda Find wykonuje wyszukiwanie liniowe, sprawdzając kolejno każdy element. Chociaż jest to proste, może nie być najbardziej wydajne w przypadku bardzo dużych zbiorów ze względu na złożoność O(n).

Jakie korzyści oferuje biblioteka PDF programistom C#?

Biblioteka PDF zapewnia rozbudowane możliwości obsługi plików PDF, umożliwiając programistom łatwe wyodrębnianie, modyfikowanie i przeszukiwanie treści PDF przy użyciu języka C#, zwiększając w ten sposób wydajność zadań związanych z dokumentami.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie