zoukankan      html  css  js  c++  java
  • [转帖]Predicate的用法

    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表达式构建的语句

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

      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;
        }
    }
  • 相关阅读:
    Document
    Document
    Document
    Document
    Document
    Document
    手动版 轮播图
    Echarts tooltip 自定义formatter设置字体颜色
    CSS3中 translate、transform 和 translation 的区别和联系,及开发问题解决
    background 属性及遇到的问题
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2662925.html
Copyright © 2011-2022 走看看