Pouvez vous m'expliquer:
Un code source descriptif sera apprécié.
Un prédicat est une fonction qui renvoie true
ou false
. Un délégué de prédicat est une référence à un prédicat.
Donc, fondamentalement, un délégué de prédicat est une référence à une fonction qui renvoie true
ou false
. Les prédicats sont très utiles pour filtrer une liste de valeurs - voici un exemple.
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;
}
}
Maintenant, si vous utilisez C # 3, vous pouvez utiliser un lambda pour représenter le prédicat de manière plus propre:
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);
}
}
En guise de réponse à la réponse d'Andrew concernant les c # 2 et c # 3 ... vous pouvez également les effectuer en ligne pour une fonction de recherche unique (voir ci-dessous).
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;
});
}
}
J'espère que cela t'aides.
Juste un délégué qui retourne un booléen. Il est beaucoup utilisé dans les listes de filtrage, mais peut être utilisé où vous le souhaitez.
List<DateRangeClass> myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
Il y a un bon article sur les prédicats ici , bien qu'il soit de l'ère .NET2, il n'y a donc aucune mention d'expressions lambda.
Qu'est-ce que le prédicat délégué?
1) Le prédicat est une fonctionnalité qui renvoie true ou false. Ce concept est entré dans le framework .net 2.0. 2) Il est utilisé avec l'expression lambda (=>). Il prend le type générique en tant qu’argument . 3) Il permet de définir une fonction de prédicat et de le passer en paramètre à une autre fonction . 4) C’est un cas particulier de Func
, dans lequel il ne prend qu'un seul paramètre et retourne toujours un bool.
Dans l'espace de noms C #:
namespace System
{
public delegate bool Predicate<in T>(T obj);
}
Il est défini dans l'espace de noms System.
Où devrions-nous utiliser Predicate Delegate?
Nous devrions utiliser Predicate Delegate dans les cas suivants:
1) Pour rechercher des éléments dans une collection générique . par exemple.
var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();
2) Exemple de base qui raccourcit le code et renvoie true ou false:
Predicate<int> isValueOne = x => x == 1;
maintenant, appelez le prédicat ci-dessus:
Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.
3) Une méthode anonyme peut également être affectée à un type de délégué prédicat comme ci-dessous:
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
bool result = isUpper("Hello Chap!!");
Toutes les meilleures pratiques sur les prédicats?
Utilisez Func, les expressions Lambda et les délégués au lieu de prédicats.
Les méthodes de recherche basées sur les prédicats permettent à un délégué de méthode ou à une expression lambda de décider si un élément donné est une «correspondance» Un prédicat est simplement un délégué qui accepte un objet et renvoie true ou false: Public delegate bool Predicate (objet 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"); }
Si vous êtes dans VB 9 (VS2008), un prédicat peut être une fonction complexe:
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 vous pouvez écrire votre prédicat sous la forme d'un lambda, à condition qu'il ne s'agisse que d'une expression:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)
Le prédicat tombe dans la catégorie des délégués génériques en C #. Ceci est appelé avec un argument et retourne toujours le type booléen. Fondamentalement, le prédicat est utilisé pour tester la condition - vrai/faux. De nombreuses classes prennent en charge les prédicats en tant qu'argument. Par exemple list.findall attend le prédicat de paramètre. Voici un exemple de prédicat.
Imaginez un pointeur de fonction avec la signature -
délégué bool myDelegate (match T);
Voici l'exemple
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 principale -
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();
}
}
}