C# Action<T>、Func<T>、Predicate<T>委托的区别、用法

参考:https://social.technet.microsoft.com/wiki/contents/articles/22418.c-action-func-tresult-and-predicate-t-delegate.aspx


下面通过例子进行介绍:

    class Program
    {
        static void Main(string[] args)
        {
            List<Employee> employees = Employee.GetEmployees();

            //Action委托

            //employees.ForEach
            Action<Employee> empAction = new Action<Employee>(Employee.CalculateAge);
            employees.ForEach(empAction);
            foreach (var e in employees)
            {
                Console.WriteLine(e.Age);
            }
            //使用 Lambda表达式:
            employees.ForEach(e => e.Age = DateTime.Now.Year - e.Birthday.Year);


            //Func 委托: Enumerable.First<TSource> 方法
            Func<Employee, bool> myFunc = new Func<Employee, bool>(Employee.NameIsEqual);
            Console.WriteLine(employees.First(myFunc).FirstName);

            //使用 Lambda表达式:
            Console.WriteLine(employees.First(e => e.FirstName == "Jaliya").FirstName);

            Console.ReadKey();
        }

        
    }

    /// <summary>
    /// 自定义 员工 类
    /// </summary>
    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime Birthday { get; set; }
        public int Age { get; set; }


        public static List<Employee> GetEmployees()
        {
            return new List<Employee>()
            {
                new Employee()
                {
                    FirstName = "Jaliya",
                    LastName = "Udagedara",
                    Birthday = Convert.ToDateTime("1986-09-11")
                },
                new Employee()
                {
                    FirstName = "Gary",
                    LastName = "Smith",
                    Birthday = Convert.ToDateTime("1988-03-11")
                }
            };
        }

        public static void CalculateAge(Employee emp)
        {
            emp.Age = DateTime.Now.Year - emp.Birthday.Year;
        }

        public static bool NameIsEqual(Employee emp)
        {
            return emp.FirstName == "Jaliya";
        }
    }


在主函数中,可以通过下面语句,获取一个List

List<Employee> employees = Employee.GetEmployees();


Action:

            接收一个或多个输入参数,但不返回任何参数,可传递至多16种不同类型的参数类型。

      例如List<T>.ForEach方法,接收一个类型为T的Action,例子如下,其中Employee是自定义类型



static void CalculateAge(Employee emp)
{
    emp.Age = DateTime.Now.Year - emp.Birthday.Year;
}

可以创建一个Action,指向上面的方法:


Action<Employee> empAction = new Action<Employee>(CalculateAge);
employees . ForEach ( empAction );  
foreach (Employee e in employees)
{
   Console.WriteLine(e.Age);
}


使用Lambda表达式,可以简化代码:

employees.ForEach(e => e.Age = DateTime.Now.Year - e.Birthday.Year);

Func<TResult>:

这种委托指向具有0、 1或多个输入参数,并返回TResult类型参数的方法。

以Enumeralbe.First<TSource>方法为例,该方法接收一个Func,并返回第一个满足条件的元素。


在这个例子中,this particular method accepts Func which accepts an Employee and returns a bool value.,因此我们需要创建一个方法,并用Func指向它。

static bool NameIsEqual(Employee emp)
{
    return emp.FirstName == "Jaliya";
}

现在我们可以创建一个Func,并获取满足Func条件的Employee:

Func<Employee, bool> myFunc = new Func<Employee, bool>(NameIsEqual);
Console.WriteLine(employees.First(myFunc).FirstName);

同样,可以使用 Lambda 表达式简化代码:

Console.WriteLine(employees.First(e => e.FirstName == "Jaliya").FirstName);
 
Predicate<T>: 

参考文章最开始的链接



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值