代码之家  ›  专栏  ›  技术社区  ›  Canavar

C中的谓词委托#

  •  246
  • Canavar  · 技术社区  · 15 年前

    你能给我解释一下吗:

    • 什么是谓词委托?
    • 我们应该在哪里使用谓词?
    • 使用谓词时有什么最佳实践吗?

    请提供描述性的源代码。

    9 回复  |  直到 5 年前
        1
  •  311
  •   Andrew Hare    15 年前

    谓词是返回 true false . 谓词委托是对谓词的引用。

    所以基本上,谓词委托是对返回 . 谓词对于筛选值列表非常有用-下面是一个示例。

    using System;
    using System.Collections.Generic;
    
    class Program
    {
        static void Main()
        {
            List<int> list = new List<int> { 1, 2, 3 };
    
            Predicate<int> predicate = new Predicate<int>(greaterThanTwo);
    
            List<int> newList = list.FindAll(predicate);
        }
    
        static bool greaterThanTwo(int arg)
        {
            return arg > 2;
        }
    }
    

    现在,如果使用C 3,可以使用lambda以更清晰的方式表示谓词:

    using System;
    using System.Collections.Generic;
    
    class Program
    {
        static void Main()
        {
            List<int> list = new List<int> { 1, 2, 3 };
    
            List<int> newList = list.FindAll(i => i > 2);
        }
    }
    
        2
  •  81
  •   WestDiscGolf    15 年前

    从安德鲁关于C 2和C 3的回答开始…您也可以为一次性搜索函数内联它们(见下文)。

    using System;
    using System.Collections.Generic;
    
    class Program
    {
        static void Main()
        {
            List<int> list = new List<int> { 1, 2, 3 };
    
            List<int> newList = list.FindAll(delegate(int arg)
                               {
                                   return arg> 2;
                               });
        }
    }
    

    希望这有帮助。

        3
  •  11
  •   Adam Carr    15 年前

    只是一个返回布尔值的委托。它在过滤列表中被大量使用,但可以在任何您想要的地方使用。

    List<DateRangeClass>  myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
    myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
    
        4
  •  8
  •   LukeH    7 年前

    有篇关于谓词的好文章 here 尽管它来自.net2时代,但这里没有提到lambda表达式。

        5
  •  6
  •   Gul Ershad    9 年前

    什么是谓词委托?

    1)谓词是返回“真”或“假”的功能。此概念在.NET 2.0框架中出现。 2)它正与lambda表达式(=>)一起使用。它将泛型类型作为参数。 3)它允许定义一个谓词函数,并将其作为参数传递给另一个函数。 4)这是 Func ,因为它只需要一个参数,并且总是返回bool。

    在C命名空间中:

    namespace System
    {   
        public delegate bool Predicate<in T>(T obj);
    }
    

    它是在系统命名空间中定义的。

    我们应该在哪里使用谓词委托?

    在下列情况下,我们应该使用谓词委托:

    1)用于搜索一般集合中的项。 例如

    var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();
    

    2)缩短代码并返回“真”或“假”的基本示例:

    Predicate<int> isValueOne = x => x == 1;
    

    现在,调用上面的谓词:

    Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.
    

    3)匿名方法也可以分配给谓词委托类型,如下所示:

    Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
        bool result = isUpper("Hello Chap!!");
    

    有关于谓词的最佳实践吗?

    使用func、lambda表达式和委托,而不是谓词。

        6
  •  5
  •   komizo    11 年前

    基于谓词的搜索方法允许方法委托或lambda表达式决定给定元素是否是__match.__ 谓词只是一个接受对象并返回“真”或“假”的委托: 公共委托bool谓词(t对象);

       static void Main()
            {
                string[] names = { "Lukasz", "Darek", "Milosz" };
                string match1 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
                //or
                string match2 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
                //or
                string match3 = Array.Find(names, x => x.Contains("L"));
    
    
                Console.WriteLine(match1 + " " + match2 + " " + match3);     // Lukasz Lukasz Lukasz
            }
            static bool ContainsL(string name) { return name.Contains("L"); }
    
        7
  •  2
  •   danlash    15 年前

    如果您在vb 9(vs2008)中,谓词可以是一个复杂函数:

    Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
    Dim newList = list.FindAll(AddressOf GreaterThanTwo)
    ...
    Function GreaterThanTwo(ByVal item As Integer) As Boolean
        'do some work'
        Return item > 2
    End Function
    

    或者,您可以将谓词作为lambda编写,只要它只是一个表达式:

    Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
    Dim newList = list.FindAll(Function(item) item > 2)
    
        8
  •  0
  •   dexterous    5 年前

    谓词属于C中的泛型委托类别。这是用一个参数调用的,并且始终返回布尔类型。基本上,谓词用于测试条件-真/假。许多类支持谓词作为参数。例如,list.findall需要参数谓词。下面是谓词的一个示例。

    想象一个带有签名的函数指针-

    bool delegate mydelegate(t match);

    下面是例子

    圣母院

    namespace PredicateExample
    {
        class Node
        {
            public string Ip_Address { get; set; }
            public string Node_Name { get; set; }
            public uint Node_Area { get; set; }
        }
    }
    

    主类-

    using System;
    using System.Threading;
    using System.Collections.Generic;
    
    namespace PredicateExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                Predicate<Node> backboneArea = Node =>  Node.Node_Area == 0 ;
                List<Node> Nodes = new List<Node>();
                Nodes.Add(new Node { Ip_Address = "1.1.1.1", Node_Area = 0, Node_Name = "Node1" });
                Nodes.Add(new Node { Ip_Address = "2.2.2.2", Node_Area = 1, Node_Name = "Node2" });
                Nodes.Add(new Node { Ip_Address = "3.3.3.3", Node_Area = 2, Node_Name = "Node3" });
                Nodes.Add(new Node { Ip_Address = "4.4.4.4", Node_Area = 0, Node_Name = "Node4" });
                Nodes.Add(new Node { Ip_Address = "5.5.5.5", Node_Area = 1, Node_Name = "Node5" });
                Nodes.Add(new Node { Ip_Address = "6.6.6.6", Node_Area = 0, Node_Name = "Node6" });
                Nodes.Add(new Node { Ip_Address = "7.7.7.7", Node_Area = 2, Node_Name = "Node7" });
    
                foreach( var item in Nodes.FindAll(backboneArea))
                {
                    Console.WriteLine("Node Name " + item.Node_Name + " Node IP Address " + item.Ip_Address);
                }
    
                Console.ReadLine();
            }
        }
    }
    
        9
  •  -3
  •   parijat mishra    9 年前

    委托定义了一个引用类型,可用于用特定签名封装方法。 C委托生命周期: 委托人的生命周期是

    • 宣言
    • 实例化
    • 侵入

    学习更多形式 http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html