.NET ヘルプ

C# 検索(開発者向けの動作方法)

公開済み 2023年6月13日
共有:

C# の便利な Find 関数に関するチュートリアルへようこそ。 あなたは、コーディングプロセスを効率化できる強力な機能を見つけました。 このチュートリアルでは、ベテランのコーダーであれ、これから始める方であれ、すべての要素を説明します。

Findの基本

「Find」は、本質的に、コレクション、配列、またはリスト内で指定された述語を満たす最初の要素を見つけるための関数です。 「述語とは何ですか?」とお尋ねですか? プログラミングにおいて、述語とはコレクション内の要素に対して定義された特定の条件をテストする関数のことです。

それでは、パブリッククラスの例を見てみましょう。


public class BikePart
{
    public string id { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null 
 !(obj is BikePart))
            return false;

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

    public override int GetHashCode()
    {
        return this.id.GetHashCode();
    }

    public override string ToString()
    {
        return "BikePart ID: " + this.id;
    }
}

public class BikePart
{
    public string id { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null 
 !(obj is BikePart))
            return false;

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

    public override int GetHashCode()
    {
        return this.id.GetHashCode();
    }

    public override string ToString()
    {
        return "BikePart ID: " + this.id;
    }
}
Public Class BikePart
	Public Property id() As String

	Public Overrides Function Equals(ByVal obj As Object) As Boolean
		If obj Is Nothing (Not (TypeOf obj Is BikePart)) Then
			Return False
		End If

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

	Public Overrides Function GetHashCode() As Integer
		Return Me.id.GetHashCode()
	End Function

	Public Overrides Function ToString() As String
		Return "BikePart ID: " & Me.id
	End Function
End Class
VB   C#

このコードでは、BikePart は公開クラスであり、各バイク部品を識別するための公開文字列 ID を含んでいます。 ToString メソッドをオーバーライドして、バイクパーツのIDをきれいに表示するようにしました。また、比較のために Equals メソッドと GetHashCode メソッドもオーバーライドしています。

述語を使用した検索の実行

私たちのBikePartクラスができたので、自転車の部品のリストを作成し、使用できます。検索ID に基づいて特定の部分を見つけるために。 次の例を考えてみましょう:


public static void Main()
{
    List bikeParts = new List
    {
        new BikePart { id = "Chain Ring ID" },
        new BikePart { id = "Crank Arm ID" },
        new BikePart { id = "Regular Seat ID" },
        new BikePart { id = "Banana Seat ID" },
    };

    Predicate findChainRingPredicate = (BikePart bp) => { return bp.id == "Chain Ring ID"; };
    BikePart chainRingPart = bikeParts.Find(findChainRingPredicate);

    Console.WriteLine(chainRingPart.ToString());
}

public static void Main()
{
    List bikeParts = new List
    {
        new BikePart { id = "Chain Ring ID" },
        new BikePart { id = "Crank Arm ID" },
        new BikePart { id = "Regular Seat ID" },
        new BikePart { id = "Banana Seat ID" },
    };

    Predicate findChainRingPredicate = (BikePart bp) => { return bp.id == "Chain Ring ID"; };
    BikePart chainRingPart = bikeParts.Find(findChainRingPredicate);

    Console.WriteLine(chainRingPart.ToString());
}
Public Shared Sub Main()
	Dim bikeParts As New List 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"}
	}

	Dim findChainRingPredicate As Predicate = Function(bp As BikePart)
		Return bp.id = "Chain Ring ID"
	End Function
	Dim chainRingPart As BikePart = bikeParts.Find(findChainRingPredicate)

	Console.WriteLine(chainRingPart.ToString())
End Sub
VB   C#

このコードでは、ユニークなIDを持つ4つのBikePartオブジェクトをインスタンス化します。 次に、バイク部品のIDが「Chain Ring ID」であるかを確認する述語 findChainRingPredicate を作成します。 最後に、定義した述語を使用して自転車部品のリストに対して Find を呼び出し、見つかった部品のIDをコンソールに出力します。

述語パラメーターを理解する

Find メソッドの Predicate match パラメータについて疑問に思っているかもしれません。 Findメソッドが要素を返す条件をここで定義します。 私たちの場合、Findメソッドで「Chain Ring ID」に一致する最初の要素を返すことを望んでいました。

条件で定義された要素が存在しない場合、Find メソッドはデフォルト値を返します。 例えば、整数の配列を扱っていて、述語が一致しない場合、Find メソッドは C# における整数のデフォルト値である '0' を返します。

線形探索の原理

重要な点として、「Find」関数は配列、リスト、またはコレクション全体に対して線形検索を実行します。 これは、最初の要素から始まり、各次の要素を順番に調べて、述語を満たす要素の最初の出現を見つけるまで続けることを意味します。

場合によっては、最初の要素ではなく、条件を満たす最後の要素を見つけたいことがあるかもしれません。 この目的のために、C#には FindLast 関数が用意されています。

FindIndexFindLastIndex

Find は指定された述語に一致する最初の要素を見つけるのに役立つように、C# は FindIndexFindLastIndex メソッドも提供しており、条件に一致する最初および最後の要素のインデックスをそれぞれ取得することができます。

例を試してみましょう:


public static void Main()
{
    List bikeParts = new List
    {
        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
    };

    Predicate findChainRingPredicate = (BikePart bp) => { return bp.id == "Chain Ring ID"; };

    int firstChainRingIndex = bikeParts.FindIndex(findChainRingPredicate);
    int lastChainRingIndex = bikeParts.FindLastIndex(findChainRingPredicate);

    Console.WriteLine($"First Chain Ring ID found at index: {firstChainRingIndex}");
    Console.WriteLine($"Last Chain Ring ID found at index: {lastChainRingIndex}");
}

public static void Main()
{
    List bikeParts = new List
    {
        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
    };

    Predicate findChainRingPredicate = (BikePart bp) => { return bp.id == "Chain Ring ID"; };

    int firstChainRingIndex = bikeParts.FindIndex(findChainRingPredicate);
    int lastChainRingIndex = bikeParts.FindLastIndex(findChainRingPredicate);

    Console.WriteLine($"First Chain Ring ID found at index: {firstChainRingIndex}");
    Console.WriteLine($"Last Chain Ring ID found at index: {lastChainRingIndex}");
}
Public Shared Sub Main()
	Dim bikeParts As New List 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"}
	}

	Dim findChainRingPredicate As Predicate = Function(bp As BikePart)
		Return bp.id = "Chain Ring ID"
	End Function

	Dim firstChainRingIndex As Integer = bikeParts.FindIndex(findChainRingPredicate)
	Dim lastChainRingIndex As Integer = bikeParts.FindLastIndex(findChainRingPredicate)

	Console.WriteLine($"First Chain Ring ID found at index: {firstChainRingIndex}")
	Console.WriteLine($"Last Chain Ring ID found at index: {lastChainRingIndex}")
End Sub
VB   C#

FindAll の力

FindAll メソッドは、その名の通り、指定された述語を満たすコレクション内のすべての要素を取得します。 特定の条件に基づいて要素をフィルタリングする必要がある場合に使用されます。 FindAllメソッドは、すべての一致する要素を含む新しいリストを返します。

コード例を以下に示します:


public static void Main()
{
    List bikeParts = new List
    {
        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
    };

    Predicate findChainRingPredicate = (BikePart bp) => { return bp.id == "Chain Ring ID"; };

    List chainRings = bikeParts.FindAll(findChainRingPredicate);

    Console.WriteLine($"Found {chainRings.Count} Chain Rings:");
    foreach (BikePart chainRing in chainRings)
    {
        Console.WriteLine(chainRing.ToString());
    }
}

public static void Main()
{
    List bikeParts = new List
    {
        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
    };

    Predicate findChainRingPredicate = (BikePart bp) => { return bp.id == "Chain Ring ID"; };

    List chainRings = bikeParts.FindAll(findChainRingPredicate);

    Console.WriteLine($"Found {chainRings.Count} Chain Rings:");
    foreach (BikePart chainRing in chainRings)
    {
        Console.WriteLine(chainRing.ToString());
    }
}
Public Shared Sub Main()
	Dim bikeParts As New List 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"}
	}

	Dim findChainRingPredicate As Predicate = Function(bp As BikePart)
		Return bp.id = "Chain Ring ID"
	End Function

	Dim chainRings As List = bikeParts.FindAll(findChainRingPredicate)

	Console.WriteLine($"Found {chainRings.Count} Chain Rings:")
	For Each chainRing As BikePart In chainRings
		Console.WriteLine(chainRing.ToString())
	Next chainRing
End Sub
VB   C#

IronPDFを導入

私たちのC# Findの知識が活用できる重要な分野は、PDF処理のための強力なC#ライブラリであるIronPDFを使用したPDFコンテンツの操作です。

様々な自転車部品に関する情報が含まれているPDF文書を扱っているとします。 しばしば、このコンテンツ内の特定の部分を見つける必要があります。 ここでIronPDFと C# Find メソッドが組み合わさり、強力なソリューションを提供します。

まず、使用しますIronPDF続けます。翻訳するテキストを提供してください。当社のPDFからテキストを抽出するそして、先ほど学んだ Find または FindAll メソッドを使用して、抽出されたテキスト内の特定の部分を見つけることができます。


using IronPdf;

PdfDocument pdf = PdfDocument.FromFile(@"C:\Users\Administrator\Desktop\bike.pdf");
string pdfText = pdf.ExtractAllText();

// Assuming our PDF text is split into lines
List pdfLines = pdfText.Split('\n').ToList();

Predicate findChainRingPredicate = (string line) => { return line.Contains("Chain Ring ID"); };
List chainRingLines = pdfLines.FindAll(findChainRingPredicate);

Console.WriteLine($"Found {chainRingLines.Count} lines mentioning 'Chain Ring ID':");
foreach (string line in chainRingLines)
{
    Console.WriteLine(line);
}

using IronPdf;

PdfDocument pdf = PdfDocument.FromFile(@"C:\Users\Administrator\Desktop\bike.pdf");
string pdfText = pdf.ExtractAllText();

// Assuming our PDF text is split into lines
List pdfLines = pdfText.Split('\n').ToList();

Predicate findChainRingPredicate = (string line) => { return line.Contains("Chain Ring ID"); };
List chainRingLines = pdfLines.FindAll(findChainRingPredicate);

Console.WriteLine($"Found {chainRingLines.Count} lines mentioning 'Chain Ring ID':");
foreach (string line in chainRingLines)
{
    Console.WriteLine(line);
}
Imports Microsoft.VisualBasic
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("C:\Users\Administrator\Desktop\bike.pdf")
Private pdfText As String = pdf.ExtractAllText()

' Assuming our PDF text is split into lines
Private pdfLines As List = pdfText.Split(ControlChars.Lf).ToList()

Private findChainRingPredicate As Predicate = Function(line As String)
	Return line.Contains("Chain Ring ID")
End Function
Private chainRingLines As List = pdfLines.FindAll(findChainRingPredicate)

Console.WriteLine($"Found {chainRingLines.Count} lines mentioning 'Chain Ring ID':")
For Each line As String In chainRingLines
	Console.WriteLine(line)
Next line
VB   C#

このコードでは、PDFを読み込み、テキストを抽出し、それを行に分割し、次にFindAllを使用して「Chain Ring ID」に言及しているすべての行を特定しました。

VB.NETでPDFファイルを表示する方法: 図1

以下は、IronPDFと一緒にFindメソッドを実際のシナリオで使用する基本的な例です。 これは、C#の有用性と多様性を示しており、プログラミング作業をより簡単かつ効率的にする強力なライブラリを備えています。

結論

このチュートリアルでは、C# の Find メソッドとその関連メソッドである FindIndexFindLastIndexFindAll について深く掘り下げていきます。 それらの用途を調査し、いくつかのコード例を調べ、それらが最も効果的な状況を明らかにしました。

また、IronPDFライブラリを使用してPDF操作の世界に進出しました。 同様に、PDFドキュメント内のコンテンツを抽出および検索する際に、Findメソッドの知識が実用的に応用されているのを見ました。

IronPDFは無料のIronPdfの試用版機能を探索し、C#プロジェクトにどのように役立つかを判断する優れた機会を提供します。 試用期間後もIronPDFを引き続き使用する場合、ライセンスは $749 から開始します。

< 以前
C# タイプ (開発者向けの仕組み)
次へ >
C# New(開発者向けの動作)