了解.NET Framework中自带的泛型委托Predicate和Comparison
Predicate表示定义一组条件并确定指定对象是否符合这些条件的方法。Comparison表示比较同一类型的两个对象的方法。本文主要介绍.NET Framework中自带的泛型委托Predicate和Comparison的使用。
1、Predicate
Predicate
相当于 Func
和Action
类似的委托。表示定义一组条件并确定指定对象是否符合这些条件的方法。Predicate
委托通常由 Array
和 List<T>
类的几种方法使用,常用于在集合中搜索元素。
.NET Framework中的定义如下,
public delegate bool Predicate<in T>(T obj)
例如,
using System;
using System.Reflection;
using System.Collections.Generic;
namespace Predicate
{public struct Point{public Point(int x,int y){this.X = x;this.Y = y;}public int X { get;set;}public int Y { get;set;}}class Program{static void Main(string[] args){Point[] points ={new Point(100,200),new Point(150,250),new Point(250,375),new Point(275,390),new Point(296,400)};Predicate<Point> predicate = FindPoints;Point first1 = Array.Find(points, predicate);Console.WriteLine("使用FindPoints:");Console.WriteLine($"Found:X={first1.X},Y={first1.Y}");Point first2 = Array.Find(points, ptn => ptn.X * ptn.Y > 100000);Console.WriteLine("使用Lambda:");Console.WriteLine($"Found:X={first2.X},Y={first2.Y}");Console.ReadKey();}private static bool FindPoints(Point ptn){return ptn.X * ptn.Y > 100000;}}
}
2、Comparison
Comparison
委托由 Array
类的 Sort<T>(T[], Comparison<T>)
方法重载和 List<T>
类的 Sort(Comparison<T>)
方法重载使用,用于对数组或列表中的元素进行排序。
.NET Framework中的定义如下,
public delegate int Comparison<in T>(T x, T y)
例如,
using System;
class ListSort
{static void Main(){int[] nums = {3,6,8,1,2,9}; //使用匿名方法实现 Comparison Array.Sort(nums , delegate(int i,int j){ if (i == j) // 这个接口的返回值为 1 0 -1. 用来实现排序{ // 这里是倒序排列return 0; //相等 返回 0}else if (i < j){return 1; }elsereturn -1;});foreach(int i in nums)Console.Write(i+",");Console.WriteLine();nums=new int[] {13,16,18,11,12,19}; //使用lambda实现 Comparison Array.Sort(nums , (int i,int j)=>{ //使用匿名方法实现 Comparison if (i == j) // 这个接口的返回值为 1 0 -1. 用来实现排序{ // 这里是倒序排列return 0; //相等 返回 0}else if (i < j){return 1; }elsereturn -1;});foreach(int i in nums)Console.Write(i+",");Console.WriteLine();nums=new int[] {23,26,28,21,22,29}; //使用定义方法实现 Comparison Array.Sort(nums , CompareValue);#region outputforeach(int i in nums)Console.Write(i+",");Console.WriteLine();#endregion}private static int CompareValue(int i,int j){if (i == j) // 这个接口的返回值为 1 0 -1. 用来实现排序{ // 这里是倒序排列return 0; //相等 返回 0}else if (i < j){return 1; }elsereturn -1;}
}