英語で読む

次の方法で共有


Array.FindLast<T>(T[], Predicate<T>) メソッド

定義

指定した述語で定義されている条件に一致する要素を検索し、Array全体の最後の出現箇所を返します。

C#
public static T FindLast<T>(T[] array, Predicate<T> match);
C#
public static T? FindLast<T>(T[] array, Predicate<T> match);

型パラメーター

T

配列の要素の型。

パラメーター

array
T[]

検索する 1 次元の 0 から始まる Array

match
Predicate<T>

検索する要素の条件を定義する Predicate<T>

戻り値

T

指定した述語で定義されている条件に一致する最後の要素 (見つかった場合)。それ以外の場合は、型の既定値 T

例外

arraynullです。

-又は-

matchnullです。

次のコード例は、ジェネリック メソッドの FindFindLast、および FindAll を示しています。 8 つの恐竜名を含む文字列の配列が作成され、そのうちの 2 つ (位置 1 と 5) は "saurus" で終わる。 このコード例では、EndsWithSaurusという名前の検索述語メソッドも定義します。このメソッドは文字列パラメーターを受け取り、入力文字列が "saurus" で終わるかどうかを示すブール値を返します。

Find ジェネリック メソッドは、配列を最初から走査し、各要素を EndsWithSaurus メソッドに順番に渡します。 EndsWithSaurus メソッドが要素 "Amargasaurus" の true を返すと、検索は停止します。

注意

C# と Visual Basic では、Predicate<string> デリゲート (Visual Basic ではPredicate(Of String)) を明示的に作成する必要はありません。 これらの言語は、コンテキストから正しいデリゲートを推論し、自動的に作成します。

FindLast ジェネリック メソッドは、配列を末尾から後方に検索するために使用されます。 位置 5 で要素 "Dilophosaurus" を検出します。 FindAll ジェネリック メソッドは、"saurus" で終わるすべての要素を含む配列を返すために使用されます。 要素が表示されます。

コード例では、ジェネリック メソッドの ExistsTrueForAll も示します。

C#
using System;

public class DinoDiscoverySet
{
    public static void Main()
    {
        string[] dinosaurs =
        {
            "Compsognathus", "Amargasaurus", "Oviraptor",
            "Velociraptor",  "Deinonychus",  "Dilophosaurus",
            "Gallimimus",    "Triceratops"
        };

        DinoDiscoverySet GoMesozoic = new DinoDiscoverySet(dinosaurs);

        GoMesozoic.DiscoverAll();
        GoMesozoic.DiscoverByEnding("saurus");
    }

    private string[] dinosaurs;

    public DinoDiscoverySet(string[] items)
    {
        dinosaurs = items;
    }

    public void DiscoverAll()
    {
        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }
    }

    public void DiscoverByEnding(string Ending)
    {
        Predicate<string> dinoType;

        switch (Ending.ToLower())
        {
            case "raptor":
                dinoType = EndsWithRaptor;
                break;
            case "tops":
                dinoType = EndsWithTops;
                break;
            case "saurus":
            default:
                dinoType = EndsWithSaurus;
                break;
        }
        Console.WriteLine(
            "\nArray.Exists(dinosaurs, \"{0}\"): {1}",
            Ending,
            Array.Exists(dinosaurs, dinoType));

        Console.WriteLine(
            "\nArray.TrueForAll(dinosaurs, \"{0}\"): {1}",
            Ending,
            Array.TrueForAll(dinosaurs, dinoType));

        Console.WriteLine(
            "\nArray.Find(dinosaurs, \"{0}\"): {1}",
            Ending,
            Array.Find(dinosaurs, dinoType));

        Console.WriteLine(
            "\nArray.FindLast(dinosaurs, \"{0}\"): {1}",
            Ending,
            Array.FindLast(dinosaurs, dinoType));

        Console.WriteLine(
            "\nArray.FindAll(dinosaurs, \"{0}\"):", Ending);

        string[] subArray =
            Array.FindAll(dinosaurs, dinoType);

        foreach(string dinosaur in subArray)
        {
            Console.WriteLine(dinosaur);
        }
    }

    // Search predicate returns true if a string ends in "saurus".
    private bool EndsWithSaurus(string s)
    {
        if ((s.Length > 5) &&
            (s.Substring(s.Length - 6).ToLower() == "saurus"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    // Search predicate returns true if a string ends in "raptor".
    private bool EndsWithRaptor(String s)
    {
        if ((s.Length > 5) &&
            (s.Substring(s.Length - 6).ToLower() == "raptor"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    // Search predicate returns true if a string ends in "tops".
    private bool EndsWithTops(String s)
    {
        if ((s.Length > 3) &&
            (s.Substring(s.Length - 4).ToLower() == "tops"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

/* This code example produces the following output:

Compsognathus
Amargasaurus
Oviraptor
Velociraptor
Deinonychus
Dilophosaurus
Gallimimus
Triceratops

Array.Exists(dinosaurs, "saurus"): True

Array.TrueForAll(dinosaurs, "saurus"): False

Array.Find(dinosaurs, "saurus"): Amargasaurus

Array.FindLast(dinosaurs, "saurus"): Dilophosaurus

Array.FindAll(dinosaurs, "saurus"):
Amargasaurus
Dilophosaurus
*/

注釈

Predicate<T> は、渡されたオブジェクトがデリゲートで定義されている条件と一致する場合に true を返すメソッドへのデリゲートです。 array の要素は、Predicate<T>に個別に渡され、最後の要素から始まり、最初の要素で終わる Array内で後方に移動します。 一致が見つかると、処理が停止します。

このメソッドは O(n) 演算であり、ここで narrayLength です。

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

こちらもご覧ください