Leggere in inglese

Condividi tramite


Predicate<T> Delegato

Definizione

Rappresenta il metodo che definisce un set di criteri e determina se l'oggetto specificato soddisfa tali criteri.

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

Parametri di tipo

T

Tipo di oggetto da confrontare.

Questo parametro di tipo è controvariante, ovvero puoi usare il tipo specificato o qualsiasi tipo meno derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.

Parametri

obj
T

Oggetto da confrontare in base ai criteri definiti all'interno del metodo rappresentato da questo delegato.

Valore restituito

Boolean

true se obj soddisfa i criteri definiti all'interno del metodo rappresentato da questo delegato; in caso contrario false.

Esempio

Nell'esempio di codice seguente viene usato un Predicate<T> delegato con il Array.Find metodo per cercare una matrice di Point strutture. Nell'esempio viene definito in modo esplicito un delegato Predicate<T> denominato predicate e gli viene assegnato un metodo denominato FindPoints che restituisce true se il prodotto dei campi Point.X e Point.Y è maggiore di 100.000. Si noti che solitamente si utilizza un'espressione lambda anziché definire in modo esplicito un delegato di tipo Predicate<T>, come illustrato nel secondo esempio.

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

L'esempio seguente è identico a quello precedente, con la differenza che viene utilizzata un'espressione lambda per rappresentare il delegato Predicate<T>. Ogni elemento della matrice viene passato all'espressione lambda fino a quando l'espressione trova un elemento che soddisfa i criteri di points ricerca. In questo caso, l'espressione lambda restituisce true se il prodotto dei campi X e Y è maggiore di 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

Commenti

Questo delegato viene usato da diversi metodi delle Array classi e List<T> per cercare elementi nella raccolta.

In genere, il delegato è rappresentato da un'espressione Predicate<T> lambda. Poiché le variabili con ambito locale sono disponibili per l'espressione lambda, è facile testare per una condizione che non è nota esattamente in fase di compilazione. Questo è simulato nell'esempio seguente, che definisce una classe che contiene informazioni su una HockeyTeam squadra della National Hockey League e l'anno in cui è stata fondata. L'esempio definisce una matrice di valori integer che rappresentano anni e assegna in modo casuale un elemento della matrice a foundedBeforeYear, ovvero una variabile con ambito locale al metodo dell'esempio Main . Poiché le variabili con ambito locale sono disponibili per un'espressione lambda, l'espressione lambda passata al metodo è in grado di restituire un HockeyTeam oggetto per ogni team basato su o prima di List<T>.FindAll quell'anno.

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

Metodi di estensione

GetMethodInfo(Delegate)

Ottiene un oggetto che rappresenta il metodo rappresentato dal delegato specificato.

Si applica a

Prodotto Versioni
.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

Vedi anche