泛型委托 Predicate/Func/Action

Predicate 泛型委托
  表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
看看下面它的定义:

// Summary:
    //     Represents the method that defines a set of criteria and determines whether
    //     the specified object meets those criteria.
    //
// Parameters:
    //   obj:
    //     The object to compare against the criteria defined within the method represented
    //     by this delegate.
    //
// Type parameters:
    //   T:
    //     The type of the object to compare.
    //
// Returns:
    //     true if obj meets the criteria defined within the method represented by this
    //     delegate; otherwise, false.

public delegate bool Predicate<T>(T obj);
类型参数介绍:
   T: 要比较的对象的类型。
   obj: 要按照由此委托表示的方法中定义的条件进行比较的对象。
   返回值:如果 obj 符合由此委托表示的方法中定义的条件,则为 true;否则为 false
看下面代码:

public class GenericDelegateDemo
    {
        List<String> listString = new List<String>()
        {
            "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
        };

String[] arrayString = new String[]
        {
             "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
        };

public String[] GetFirstStringFromArray()
        {
            return Array.FindAll(arrayString, (c) => { return c.Length <=3; });
        }

public List<String> GetFirstStringFromList()
        {
            return listString.FindAll((c) => { return c.Length <=3; });
        }

public String[] GetFirstStringFromArray_1()
        {
            return Array.FindAll(arrayString, GetString);
        }

public List<String> GetFirstStringFromList_1()
        {
            return listString.FindAll(GetString);
        }

private bool GetString(String str)
        {
            if (str.Length <=3)
                return true;
            else
                return false;
        }
    }

(1)首先,上面以 数组和泛型List 两个集合作为演示对象,并构建集合。
(2)接着,两者同时使用各自 所有的 FindALL方法,参见如下定义:
    Array : public T[] FindAll<T>(T[] array, Predicate<T> match);
    List:public List<T> FindAll(Predicate<T> match);
    注意的是,两处的FindAll 均采用了Predicate (泛型委托)作为参数的类型。
(3)接着,使用两者方式展现 对Predicate 的使用:
    第一种:  (c) => { return c.Length <= 3; };
    第二种: GetString(String str)。
这两者在语法上明显不同,但是实际是做相同的事情,第一种是使用Lambda表达式构建的语句,关于Lambda这里不做详述,请参见笔者C#3.0特性相关文章。

补充的是你也可以这样写,

delegate(String c){return c.Length<=3;}

作为 Predicate定义的参数
完整代码:

XX.FindAll(delegate(String c) { return c.Length <=3; });

这应该称为匿名代理了。
其他使用到Predicate 有
  Array.Find , Array.FindAll , Array.Exists , Array.FindLast , Array.FindIndex ..... 
  List<T>.Find , List<T>.FindAll , List<T>.Exists , List<T>.FindLast , List<T>.FindIndex ..... 
延伸:
  除了上面提到的外,你完全可以使用Predicate 定义新的方法,来加强自己代码。

public class GenericDelegateDemo
{
    List<String> listString = new List<String>()
    {
        "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
    };

public String GetStringList(Predicate<String> p)
    {
        foreach(string item in listString)
        {
            if (p(item))
                return item;
        }
        return null;
    }

public bool ExistString()
    {
        string str = GetStringList((c) => { return c.Length <= 3 && c.Contains(‘S‘); });
        if (str == null)
            return false;
        else
            return true;
    }
}

同样解决了上面的问题,这里罗嗦了只是为说明Predicate的用法而已。
对于Predicate的应用当然这不是什么新鲜事情,今天细细思味一番,觉得C# 真是一门优雅的语言。
以供初学者参考。
笔者本想对以下几种泛型委托一一做些介绍和总结的,在理解Predicate的过程中,发现只要理解了泛型、委托和匿名代理,
当然你晓得Lambda表达式更好,就完全可以在适当的时候灵活应用他们了。也就是说,只是定义不同的delegate而已,
一是 你可以自己定义这样的delegate,再行使用;
二是 你需要知道象Predicate、Func、Action这样的已有好的delegate是如何定义的。或者使用的时候适当查阅下MSDN即可。
如:
Func():封装一个不具有参数但却返回 TResult 参数指定的类型值的方法。
Func(T1, T2, TResult):封装一个具有两个参数并返回 TResult 参数指定的类型值的方法,没有T2就是封装一个具有参数并....。
Action() Action(T1) Action(T2) : 封装一个方法,该方法指定数量的参数(如()无参数,(T1)一个参数,以此类推)并且不返回值。这个和Func有相似处,但无返回值而已。

提醒大家的注意的是:
  x=>x+x;
    与

X=> {return x+x;} 是等价的。

针对解释我又结合MVC做了下练习。

1、结构

2、如图分别在Controller 下建立PredicateController.cs;Views下建立Predicate文件夹,然后在其下建立index (View)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace PredicatePractice.Controllers
{
    public class PredicateController : Controller
    {
        //
        // GET: /Predicate/
        
        public ActionResult Index()
        {
            List<string> StrList = new List<string>() { 
            "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
            };

string[] arrayList = new string[] {
            "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
            };
            //返回arrayList中长度小于3的单词数组(string[])
            string[] NewArray = Array.FindAll(arrayList, c => c.Length < 4);

//返回StrList中中长度小于3的单词数组(List<string>)
            List<string> NewList = StrList.FindAll(c => c.Length < 4);

//利用CheckStr方法(泛型委托)来进行筛选
            string[] NewArrayUseCheckFunc = Array.FindAll(arrayList, CheckStr);

//利用CheckStr方法(泛型委托)来进行筛选
            List<string> NewListUseCheckPredicate = StrList.FindAll(CheckStr);

ViewData["NewArray"] = NewArray;
            ViewData["NewList"] = NewList;
            ViewData["NewArrayUseCheckFunc"] = NewArrayUseCheckFunc;
            ViewData["NewListUseCheckPredicate"] = NewListUseCheckPredicate;
            return View();
        }

/// <summary>
        /// 检查字符串S长度 是否小于4
        /// </summary>
        /// <param name="S"></param>
        /// <returns></returns>
        private bool CheckStr(string S)
        {
            if (S.Length < 4)
                return true;
            else
                return false;
        }

}
}

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Pradicatepractice
    <br />
        数组{"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"}<br />
        --------------Begin--------------<br />
        <font color="red"><b>string[] NewArray = Array.FindAll(arrayList, c => c.Length < 3);</b></font><br />
        结果:
        <% IList<string> NewArray = (ViewData["NewArray"] as IEnumerable<string>).ToList<string>(); %>
        <%= Html.Display("<br/>") %>
        <% for (int i = 0; i < NewArray.Count; i++) %>
        <% { %>
        <%= Html.Label(NewArray[i].ToString())%>
        <% } %>
        <br />
        ------------------------------<br />
        <font color="red"><b>List< string > NewList = StrList.FindAll(c => c.Length < 3);</b></font><br />
        结果:
        <% IList<string> NewList = (ViewData["NewList"] as IEnumerable<string>).ToList<string>(); %>
        <% for (int j = 0; j < NewList.Count; j++) %>
        <% { %>
        <%= Html.Label(NewList[j].ToString())%>
        <% } %>
        <br />
        ------------------------------<br />
        <font color="red"><b>Lstring[] NewArrayUseCheckFunc = Array.FindAll(arrayList, CheckStr);</b></font><br />
        结果:
        <% IList<string> NewArrayUseCheckFunc = (ViewData["NewArrayUseCheckFunc"] as IEnumerable<string>).ToList<string>(); %>
        <% for (int k = 0; k < NewArrayUseCheckFunc.Count; k++) %>
        <% { %>
        <%= Html.Label(NewArrayUseCheckFunc[k].ToString())%>
        <% } %>
        <br />
        ------------------------------<br />
        <font color="red"><b>List< string > NewListUseCheckPredicate = StrList.FindAll(CheckStr);</b></font><br />
        结果:
        <% IList<string> NewListUseCheckPredicate = (ViewData["NewListUseCheckPredicate"] as IEnumerable<string>).ToList<string>(); %>
        <% for (int l = 0; l < NewListUseCheckPredicate.Count; l++) %>
        <% { %>
        <%= Html.Label(NewListUseCheckPredicate[l].ToString())%>
        <% } %>
        <br />
        ---------------End---------------<br />
    </h2>

</asp:Content>

效果如图:

时间: 2024-10-07 15:26:12

泛型委托 Predicate/Func/Action的相关文章

C#的泛型委托Predicate/Func/Action

Predicate<T> 是一个委托,它代表了一个方法,它的定义是: namespace System {    // 摘要:    表示定义一组条件并确定指定对象是否符合这些条件的方法.  // 参数:    //   obj:    要按照由此委托表示的方法中定义的条件进行比较的对象.  // 类型参数:    //   T:    要比较的对象的类型.        // 返回结果:    //     如果 obj 符合由此委托表示的方法中定义的条件,则为 true:否则为 false

C#语法糖之第六篇: 泛型委托- Predicate&lt;T&gt;、Func&lt;T&gt;

今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值.首先我们看一下它的定义吧: 1 public delegate bool Predicate<T>(T obj); 从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用

Java实现泛型委托类似C#Action&lt;T&gt;

一.C# Action<T> 泛型委托(帮助理解委托) 描述: 封装一个方法,该方法只采用一个参数并且不返回值. 语法: public delegate void Action<T>(T arg); T: 参数类型:此委托封装的方法的参数类型 arg: 参数:此委托封装的方法的参数 备注: 通过此委托,可以将方法当做参数进行传递.Action<T> 泛型委托:封装一个方法,该方法只采用一个参数并且不返回值.可以使用此委托以参数形式传递方法,而不用显式声明自定义的委托.该

系统内置委托:Func/Action

lSystem.Func 代表有返回类型的委托 lpublic delegate TResult  Func<out TResult>(); lpublic delegate TResult  Func<in T, out TResult>(T arg); l...... l注:输入泛型参数-in 最多16个,输出泛型参数 -out 只有一个. lSystem.Action 代表无返回类型的委托 lpublic delegate void Action<in T>(T

C#内置泛型委托:Func委托

1.什么是Func委托 Func委托代表有返回类型的委托 2.Func委托定义 查看Func的定义: using System.Runtime.CompilerServices; namespace System { // // 摘要: // 封装一个方法,该方法具有两个参数,并返回由 TResult 参数指定的类型的值. // // 参数: // arg1: // 此委托封装的方法的第一个参数. // // arg2: // 此委托封装的方法的第二个参数. // // 类型参数: // T1:

c#中的泛型委托(@WhiteTaken)

今天学习一下c#中的泛型委托. 1.一般的委托,delegate,可以又传入参数(<=32),声明的方法为  public delegate void SomethingDelegate(int a); 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace delegate

C# 委托 (一)—— 委托、 泛型委托与Lambda表达式

C# 委托 (一)—— 委托. 泛型委托与Lambda表达式 2018年08月19日 20:46:47 wnvalentin 阅读数 2992 版权声明:此文乃博主之原创.鄙人才疏,望大侠斧正.此文可转载,然需明根以溯源. https://blog.csdn.net/wnvalentin/article/details/81840339 目录 1 委托的含义 2 委托声明.实例化和调用 2.1 委托的声明 2.2 委托的实例化 2.3 委托实例的调用 3 泛型委托 3.1 Func委托 3.2

系统内置的泛型委托

#region 系统内置的泛型委托 //只要是Action委托都是无返回值的. ////1.存储无参数无返回值的方法 //Action md = () => { Console.WriteLine("无参数无返回值."); }; //md(); //Console.Read(); ////2.有一个参数没有返回值 //Action<string, int> md = (s, i) => { Console.WriteLine(s + " "

C#委托(delegate、Action、Func、predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明   Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.   例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型. (2). Action Action是无返回值的泛型委托. Action 表示无参,