英語で読む

次の方法で共有


Predicate<T> 代理人

定義

条件のセットを定義し、指定されたオブジェクトがその条件を満たしているかどうかを判断するメソッドを表わします。

C#
public delegate bool Predicate<in T>(T obj);
C#
public delegate bool Predicate<T>(T obj);

型パラメーター

T

比較するオブジェクトの型。

この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。

パラメーター

obj
T

このデリゲートで表されるメソッド内で定義された基準と照らし合わせて比較するオブジェクト。

戻り値

Boolean

このデリゲートで表されるメソッド内で定義された基準を obj が満たしている場合は true。それ以外の場合は false

次のコード例では、メソッドと Predicate<T> 共にデリゲートを Array.Find 使用して構造体の Point 配列を検索します。 この例では、名前付きのデリゲートをPredicate<T>明示的に定義し、フィールドの積Point.XPoint.Yが 100,000 を超える場合に返すtrueメソッドFindPointsを割り当てます。predicate 2 番目の例に示すように、型 Predicate<T>のデリゲートを明示的に定義するのではなく、ラムダ式を使用するのが一慣例であることに注意してください。

C#
using System;
using System.Drawing;

public class Example
{
   public static void Main()
   {
      // Create an array of Point structures.
      Point[] points = { new Point(100, 200),
                         new Point(150, 250), new Point(250, 375),
                         new Point(275, 395), new Point(295, 450) };

      // Define the Predicate<T> delegate.
      Predicate<Point> predicate = FindPoints;

      // Find the first Point structure for which X times Y
      // is greater than 100000.
      Point first = Array.Find(points, predicate);

      // Display the first structure found.
      Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
   }

   private static bool FindPoints(Point obj)
   {
      return obj.X * obj.Y > 100000;
   }
}
// The example displays the following output:
//        Found: X = 275, Y = 395

次の例は前の例と同じですが、ラムダ式を使用してデリゲートを表す点が Predicate<T> 異なります。 配列の points 各要素は、式が検索条件を満たす要素を見つけるまでラムダ式に渡されます。 この場合、X フィールドと Y フィールドの積が 100,000 を超える場合、ラムダ式が返 true されます。

C#
using System;
using System.Drawing;

public class Example
{
   public static void Main()
   {
      // Create an array of Point structures.
      Point[] points = { new Point(100, 200),
                         new Point(150, 250), new Point(250, 375),
                         new Point(275, 395), new Point(295, 450) };

      // Find the first Point structure for which X times Y
      // is greater than 100000.
      Point first = Array.Find(points, x => x.X * x.Y > 100000 );

      // Display the first structure found.
      Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
   }
}
// The example displays the following output:
//        Found: X = 275, Y = 395

注釈

このデリゲートは、コレクション内の要素を Array 検索するために、いくつかのメソッドと List<T> クラスで使用されます。

通常、 Predicate<T> デリゲートはラムダ式で表されます。 ローカルスコープ変数はラムダ式で使用できるため、コンパイル時に正確に知られていない条件を簡単にテストできます。 これは次の例でシミュレートされています。この例では、ナショナル・Hockey League チームとそれが設立された年に関する情報を含むクラスを定義 HockeyTeam します。 この例では、年を表す整数値の配列を定義し、配列 foundedBeforeYearの 1 つの要素をランダムに割り当てます。これは、この例の Main メソッドに対してローカルスコープの変数です。 ローカルスコープ変数はラムダ式で使用できるため、メソッドに List<T>.FindAll 渡されるラムダ式は、その年以前に設立された各チームのオブジェクトを返 HockeyTeam すことができます。

C#
using System;
using System.Collections.Generic;

public class HockeyTeam
{
   private string _name;
   private int _founded;

   public HockeyTeam(string name, int year)
   {
      _name = name;
      _founded = year;
   }

   public string Name {
      get { return _name; }
   }

   public int Founded {
      get { return _founded; }
   }
}

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      List<HockeyTeam> teams = new List<HockeyTeam>();
      teams.AddRange( new HockeyTeam[] { new HockeyTeam("Detroit Red Wings", 1926),
                                         new HockeyTeam("Chicago Blackhawks", 1926),
                                         new HockeyTeam("San Jose Sharks", 1991),
                                         new HockeyTeam("Montreal Canadiens", 1909),
                                         new HockeyTeam("St. Louis Blues", 1967) } );
      int[] years = { 1920, 1930, 1980, 2000 };
      int foundedBeforeYear = years[rnd.Next(0, years.Length)];
      Console.WriteLine("Teams founded before {0}:", foundedBeforeYear);
      foreach (var team in teams.FindAll( x => x.Founded <= foundedBeforeYear))
         Console.WriteLine("{0}: {1}", team.Name, team.Founded);
   }
}
// The example displays output similar to the following:
//       Teams founded before 1930:
//       Detroit Red Wings: 1926
//       Chicago Blackhawks: 1926
//       Montreal Canadiens: 1909

拡張メソッド

GetMethodInfo(Delegate)

指定したデリゲートによって表されるメソッドを表すオブジェクトを取得します。

適用対象

製品 バージョン
.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
.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
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

こちらもご覧ください