添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft Edge More info about Internet Explorer and Microsoft Edge
generic <typename T>
public delegate bool Predicate(T obj);
public delegate bool Predicate<in T>(T obj);
public delegate bool Predicate<T>(T obj);
type Predicate<'T> = delegate of 'T -> bool
Public Delegate Function Predicate(Of In T)(obj As T) As Boolean 
Public Delegate Function Predicate(Of T)(obj As T) As Boolean 

Type Parameters

The type of the object to compare.

This type parameter is contravariant. That is, you can use either the type you specified or any type that is less derived. For more information about covariance and contravariance, see Covariance and Contravariance in Generics .

Parameters

true if obj meets the criteria defined within the method represented by this delegate; otherwise, false .

Examples

The following code example uses a Predicate<T> delegate with the Array.Find method to search an array of Point structures. The example explicitly defines a Predicate<T> delegate named predicate and assigns it a method named FindPoints that returns true if the product of the Point.X and Point.Y fields is greater than 100,000. Note that it is customary to use a lambda expression rather than to explicitly define a delegate of type Predicate<T> , as the second example illustrates.

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 open System open System.Drawing let findPoints (obj: Point) = obj.X * obj.Y > 100000 // Create an array of Point structures. let points = [| Point(100, 200) Point(150, 250) Point(250, 375) Point(275, 395) Point(295, 450) |] // Define the Predicate<T> delegate. let predicate = Predicate<Point> findPoints // Find the first Point structure for which X times Y // is greater than 100000. let first = Array.Find(points, predicate) // Display the first structure found. printfn $"Found: X = {first.X}, Y = {first.Y}" // The example displays the following output: // Found: X = 275, Y = 395 Imports System.Drawing Public Class Example Public Shared Sub Main() ' Create an array of Point structures. Dim points() As Point = { new Point(100, 200), new Point(150, 250), new Point(250, 375), new Point(275, 395), new Point(295, 450) } ' Define the Predicate(Of T) delegate. Dim predicate As Predicate(Of Point) = AddressOf Example.FindPoints ' Find the first Point structure for which X times Y ' is greater than 100000. Dim first As Point = Array.Find(points, predicate) ' Display the first structure found. Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y) End Sub Private Shared Function FindPoints(obj As Point) As Boolean Return obj.X * obj.Y > 100000 End Function End Class ' The example displays the following output: ' Found: X = 275, Y = 395

The following example is identical to the previous example, except that it uses a lambda expression to represent the Predicate<T> delegate. Each element of the points array is passed to the lambda expression until the expression finds an element that meets the search criteria. In this case, the lambda expression returns true if the product of the X and Y fields is greater than 100,000.

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 open System open System.Drawing // Create an array of Point structures. let points = [| Point(100, 200) Point(150, 250) Point(250, 375) Point(275, 395) Point(295, 450) |] // Find the first Point structure for which X times Y // is greater than 100000. let first = Array.Find(points, fun x -> x.X * x.Y > 100000) // Display the first structure found. printfn $"Found: X = {first.X}, Y = {first.Y}" // The example displays the following output: // Found: X = 275, Y = 395 Imports System.Drawing Public Class Example Public Shared Sub Main() ' Create an array of Point structures. Dim points() As Point = { 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. Dim first As Point = Array.Find(points, Function(x) x.X * x.Y > 100000 ) ' Display the first structure found. Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y) End Sub End Class ' The example displays the following output: ' Found: X = 275, Y = 395

Remarks

This delegate is used by several methods of the Array and List<T> classes to search for elements in the collection.

Typically, the Predicate<T> delegate is represented by a lambda expression. Because locally scoped variables are available to the lambda expression, it is easy to test for a condition that is not precisely known at compile time. This is simulated in the following example, which defines a HockeyTeam class that contains information about a National Hockey League team and the year in which it was founded. The example defines an array of integer values that represent years, and randomly assigns one element of the array to foundedBeforeYear , which is a variable that is locally scoped to the example's Main method. Because locally scoped variables are available to a lambda expression, the lambda expression passed to the List<T>.FindAll method is able to return a HockeyTeam object for each team founded on or before that year.

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 open System type HockeyTeam = { Name: string Founded: int } let rnd = Random() let teams = ResizeArray() teams.AddRange [| { Name = "Detroit Red Wings"; Founded = 1926 } { Name = "Chicago Blackhawks"; Founded = 1926 } { Name = "San Jose Sharks"; Founded = 1991 } { Name = "Montreal Canadiens"; Founded = 1909 } { Name = "St. Louis Blues"; Founded = 1967 }|] let years = [| 1920; 1930; 1980; 2000 |] let foundedBeforeYear = years[rnd.Next(0, years.Length)] printfn $"Teams founded before {foundedBeforeYear}:" for team in teams.FindAll(fun x -> x.Founded <= foundedBeforeYear) do printfn $"{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 Imports System.Collections.Generic Public Class HockeyTeam Private _name As String Private _founded As Integer Public Sub New(name As String, year As Integer) _name = name _founded = year End Sub Public ReadOnly Property Name As String Return _name End Get End Property Public ReadOnly Property Founded As Integer Return _founded End Get End Property End Class Module Example Public Sub Main() Dim rnd As New Random() Dim teams As New List(Of HockeyTeam)() teams.AddRange( { 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) } ) Dim years() As Integer = { 1920, 1930, 1980, 2000 } Dim foundedBeforeYear As Integer = years(rnd.Next(0, years.Length)) Console.WriteLine("Teams founded before {0}:", foundedBeforeYear) For Each team in teams.FindAll( Function(x) x.Founded <= foundedBeforeYear ) Console.WriteLine("{0}: {1}", team.Name, team.Founded) End Sub End Module ' The example displays output similar to the following: ' Teams founded before 1930: ' Detroit Red Wings: 1926 ' Chicago Blackhawks: 1926 ' Montreal Canadiens: 1909

Extension Methods