.NET ヘルプ

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

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
$vbLabelText   $csharpLabel

このコードでは、BikePartはパブリッククラスであり、各バイク部品を識別するためのパブリック文字列IDを含んでいます。 私たちは、バイク部品のIDをきれいに印刷するためにToStringメソッドをオーバーライドし、比較の目的でEqualsおよびGetHashCodeメソッドもオーバーライドしました。

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

これでBikePartクラスができたので、バイクの部品リストを作成し、Findを使用して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
$vbLabelText   $csharpLabel

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

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

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

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

線形探索の原理

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

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

FindIndexFindLastIndex

C#では、指定した述語に一致する要素の最初の出現を見つけるのに役立つFindのように、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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

このコードでは、PDFを読み込み、テキストを抽出し、行ごとに分割した後、FindAllを使用して「Chain Ring ID」に言及しているすべての行を見つけ出しました。

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

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

結論

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

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

IronPDFは、IronPDFの無料トライアルを提供しており、その機能を探索し、C#プロジェクトにどのように役立つかを判断するのに最適な機会を提供します。 試用期間後にIronPDFの使用を続けることを決定した場合、ライセンスは$749から開始します。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# タイプ (開発者向けの仕組み)
次へ >
C# New(開発者向けの動作)