Os delegados predicados em C #
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.
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