Прочитать на английском

Поделиться через


Predicate<T> Делегат

Определение

Представляет метод, определяющий набор критериев и соответствие указанного объекта этим критериям.

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

Параметры типа

T

Тип сравниваемого объекта.

Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.

Параметры

obj
T

Объект, проверяемый на соответствие критериям, заданным в методе, который представлен его делегатом.

Возвращаемое значение

Boolean

Значение true, если объект obj удовлетворяет критериям, заданным в методе, который представляет этот делегат; в противном случае — значение false.

Примеры

В следующем примере кода используется делегат с методом Predicate<T> Array.Find для поиска массива Point структур. В примере явно определяется Predicate<T> делегат с именем predicate и назначается метод с именем FindPoints , который возвращает, true если произведение Point.X и Point.Y поля больше 100 000. Обратите внимание, что лямбда-выражение обычно используется вместо явного определения делегата типа 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 передается в лямбда-выражение, пока выражение не найдет элемент, соответствующий условиям поиска. В этом случае лямбда-выражение возвращается true , если произведение полей X и Y превышает 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

Комментарии

Этот делегат используется несколькими методами Array и List<T> классами для поиска элементов в коллекции.

Как правило, Predicate<T> делегат представлен лямбда-выражением. Так как локальные переменные с заданной областью доступны для лямбда-выражения, легко проверить условие, которое не известно точно во время компиляции. Это имитируется в следующем примере, который определяет HockeyTeam класс, содержащий сведения о команде Национальной хоккейной лиги и году, в котором она была основана. В примере определяется массив целых значений, представляющих годы, и случайным образом присваивается одному элементу массива foundedBeforeYear, который является переменной, которая локально ограничена методом примера 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

См. также раздел