搞不明白这个 predicate<T>,能详细介绍有关知识吗?

解决方案 »

  1.   

    下面的代码示例使用带有 Array.Find 方法的 Predicate 委托搜索 Point 结构的数组。如果 X 和 Y 字段的乘积大于 100,000,此委托表示的方法 ProductGT10 将返回 true。Find 方法为数组的每个元素调用此委托,在符合测试条件的第一个点处停止。 
    using System;
    using System.Drawing;public class Example
    {
        public static void Main()
        {
            // Create an array of five Point structures.
            Point[] points = { new Point(100, 200), 
                new Point(150, 250), new Point(250, 375), 
                new Point(275, 395), new Point(295, 450) };        // To find the first Point structure for which X times Y 
            // is greater than 100000, pass the array and a delegate
            // that represents the ProductGT10 method to the Shared 
            // Find method of the Array class. 
            Point first = Array.Find(points, ProductGT10);        // Note that you do not need to create the delegate 
            // explicitly, or to specify the type parameter of the 
            // generic method, because the C# compiler has enough
            // context to determine that information for you.        // Display the first structure found.
            Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
        }    // This method implements the test condition for the Find
        // method.
        private static bool ProductGT10(Point p)
        {
            if (p.X * p.Y > 100000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }/* This code example produces the following output:Found: X = 275, Y = 395
     */
      

  2.   

    以上的内容,我都搜到过,predicate 是委托吗?委托不用定义吗?
      

  3.   

    当然需要...下面就是它的声明,这就是CLR做的事...
    namespace System
    {
        // 摘要:
        //     表示定义一组条件并确定指定对象是否符合这些条件的方法。
        //
        // 参数:
        //   obj:
        //     要按照由此委托表示的方法中定义的条件进行比较的对象。
        //
        // 类型参数:
        //   T:
        //     要比较的对象的类型。
        //
        // 返回结果:
        //     如果 obj 符合由此委托表示的方法中定义的条件,则为 true;否则为 false。
        public delegate bool Predicate<T>(T obj);
    }
      

  4.   

    谢谢wrhero,总能发现我迷惑的地方。这么说,这个委托是已经定义好的,只要拿来用就可以了?
      

  5.   

    但是,CLR为什么要定义这个呢,我们不是可以自己定义吗?
      

  6.   


    都为你定义好了还不开心啊。哈哈。
    因为framework中有很多地方都需要用到Predicate<T>,所以就预先定义好啊。其实还有一种委托:Func<T, TResult>,如果使用bool来约束TResult,其表象就跟Predicate<T>是一样的,即指代这样一些函数,这些函数的参数类型是T,返回值是bool。
    请参考:http://www.sunnychen.org/article.asp?id=86