Pergunta

Pode explicar-me:

  • O que é um predicado Delegado?
  • Onde devemos usar predicados?
  • Qualquer melhores práticas ao utilizar predicados?

código fonte descritiva será apreciado.

Foi útil?

Solução

Um predicado é uma função que retorna true ou false. Um delegado predicado é uma referência a um predicado.

Então, basicamente, um delegado predicado é uma referência a uma função que retorna true ou false. Predicados são muito úteis para filtrar uma lista de valores - aqui está um exemplo.

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;
    }
}

Agora, se você estiver usando C # 3, você pode usar um lambda para representar o predicado de uma forma mais limpa:

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);
    }
}

Outras dicas

Comandando a partir de resposta de Andrew com relação ao c # 2 e # 3 c ... você pode também fazê-los em linha para um fora de uma função de pesquisa (veja abaixo).

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;
                           });
    }
}

Espero que isso ajude.

Apenas um delegado que retorna um boolean. É muito usado em listas de filtragem mas pode ser usado onde quer que você gostaria.

List<DateRangeClass>  myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):

Há um bom artigo sobre predicados aqui , embora seja da era .NET2, então não há nenhuma menção de expressões lambda lá.

O que é predicado Delegado?

1) predicado é uma característica que retorna verdadeiro ou conceito false.This veio em .NET Framework 2.0. 2) Ele está sendo usado com expressão lambda (=>). Leva tipo genérico como um argumento. 3) Permite uma função predicado deve ser definido e transmitido como um parâmetro para outra função. 4) É um caso especial de um Func, na medida em que leva apenas um único parâmetro e sempre retorna um bool.

Em C # namespace:

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

Ela é definida no namespace System.

Onde devemos usar predicado Delegado?

Devemos usar predicado Delegado nos seguintes casos:

1) Para pesquisar itens em uma coleção genérica. por exemplo.

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

2) Exemplo básico que encurta o código e retorna verdadeiro ou falso:

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

Agora, Call acima predicado:

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

3) Método Um anônimo também pode ser atribuído a um tipo de delegado predicado como abaixo:

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

Qualquer melhores práticas sobre predicados?

Use Func, expressões lambda e delegados em vez de predicados.

Os métodos de busca baseados em predicados permitir que um delegado método ou expressão lambda para decidir se um determinado elemento é um “match”. Um predicado é simplesmente um delegado aceitar um objeto e retornar verdadeiro ou falso: delegado public bool (object T) Predicado;

   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"); }

Se você estiver em VB 9 (VS2008), um predicado pode ser uma função complexa:

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

Ou você pode escrever seu predicado como um lambda, contanto que ele é apenas uma expressão:

Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)

predicado se enquadra na categoria de representantes genéricos em C #. Isso é chamado com um argumento e sempre retornar tipo boolean. Basicamente, o predicado é usado para testar a condição - true / false. Muitas classes apoiar predicado como um argumento. Por exemplo list.findall espera que o predicado parâmetro. Aqui está um exemplo do predicado.

Imagine um ponteiro de função com a assinatura -

bool delegado myDelegate (match T);

Aqui está o exemplo

Node.cs

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

classe principal -

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();
        }
    }
}

Um delegado define um tipo de referência que pode ser usado para encapsular um método com uma assinatura específica. C # delegado ciclo de vida: O ciclo de vida de C # delegado

  • Declaração
  • instanciação
  • INVACATION

aprender mais forma http : //asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top