Predicate<T> Delegat

Definicja

Reprezentuje metodę definiującą zestaw kryteriów i określającą, czy określony obiekt spełnia te kryteria.

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

Parametry typu

T

Typ obiektu do porównania.

Ten parametr typu jest kontrawariantny. Oznacza to, że możesz użyć typu, który został przez Ciebie określony, lub dowolnego typu, który jest mniej pochodny. Aby uzyskać więcej informacji o kowariancji i kontrawariancji, zobacz Kowariancja i kontrawariancja w typach ogólnych.

Parametry

obj
T

Obiekt do porównania z kryteriami zdefiniowanymi w metodzie reprezentowanej przez ten delegat.

Wartość zwracana

Boolean

truejeśli obj spełnia kryteria zdefiniowane w metodzie reprezentowanej przez tego delegata; w przeciwnym razie . false

Przykłady

Poniższy przykład kodu używa delegata Predicate<T> z Array.Find metodą do wyszukiwania tablicy Point struktur. Przykład jawnie definiuje delegata o nazwie i przypisuje mu metodę Predicate<T> o nazwie FindPoints predicate , która zwracatrue, jeśli produkt Point.X pól i Point.Y jest większy niż 100 000. Należy pamiętać, że jest on niestandardowy, aby użyć wyrażenia lambda, a nie jawnego zdefiniowania delegata typu Predicate<T>, jak pokazano w drugim przykładzie.

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

Poniższy przykład jest identyczny z poprzednim przykładem, z wyjątkiem tego, że używa wyrażenia lambda do reprezentowania delegata Predicate<T> . Każdy element points tablicy jest przekazywany do wyrażenia lambda, dopóki wyrażenie nie znajdzie elementu spełniającego kryteria wyszukiwania. W tym przypadku wyrażenie lambda zwraca wartość true , jeśli produkt pól X i Y jest większy niż 100 000.

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

Uwagi

Ten delegat jest używany przez kilka metod Array i List<T> klas do wyszukiwania elementów w kolekcji.

Predicate<T> Zazwyczaj delegat jest reprezentowany przez wyrażenie lambda. Ponieważ zmienne o określonym zakresie lokalnym są dostępne dla wyrażenia lambda, łatwo jest przetestować warunek, który nie jest dokładnie znany w czasie kompilacji. Jest to symulowane w poniższym przykładzie, który definiuje klasę zawierającą HockeyTeam informacje o drużynie National Hockey League i roku, w którym została założona. W przykładzie zdefiniowano tablicę wartości całkowitych reprezentujących lata, a losowo przypisuje jeden element tablicy do foundedBeforeYearzmiennej, która jest zmienną, która jest lokalnie ograniczona do metody przykładu Main . Ponieważ zmienne o określonym zakresie lokalnym są dostępne dla wyrażenia lambda, wyrażenie lambda przekazane do List<T>.FindAll metody może zwrócić HockeyTeam obiekt dla każdego zespołu opartego na lub przed tym rokiem.

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

Metody rozszerzania

GetMethodInfo(Delegate)

Pobiera obiekt reprezentujący metodę reprezentowaną przez określonego delegata.

Dotyczy

Produkt Wersje
.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

Zobacz też