Frage

Können Sie mir erklären:

  • Was ist ein Prädikat Delegieren?
  • Wo sollen wir verwenden Prädikate?
  • Jede Best Practices bei der Verwendung von Prädikaten?

Beschreibende Source-Code wird geschätzt.

War es hilfreich?

Lösung

Ein Prädikat ist eine Funktion, die true oder false zurückgibt. Ein Prädikat Delegierter ist ein Verweis auf ein Prädikat.

Also im Grunde ein Prädikat Delegierter ist ein Verweis auf eine Funktion, die true oder false zurückgibt. Prädikate sind sehr nützlich, eine Liste von Werten für die Filterung - hier ein Beispiel.

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

Nun, wenn Sie C # 3 verwenden, können Sie einen Lambda verwenden Sie das Prädikat in eine sauberere Art und Weise darzustellen:

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

Andere Tipps

Führende auf von Andrew Antwort in Bezug auf c # 2 und c # 3 ... können Sie tun, um sie auch inline für eine einmalige Suchfunktion (siehe unten).

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

Hope, das hilft.

Nur ein Delegierter, der einen Booleschen Wert zurück. Es wird viel in Filterlisten verwendet, kann aber verwendet werden, wo immer Sie möchten.

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

Es gibt einen guten Artikel über Prädikate hier , obwohl es von der .NET2 Ära, also gibt es keine Erwähnung von Lambda-Ausdrücke in dort.

Was ist Prädikat Delegieren?

1) Prädikat ist ein Feature, das wahr oder false.This Konzept in .net 2.0-Framework hat wieder kommen. 2) Es wird mit Lambda-Ausdruck verwendet (=>). Es dauert generischen Typen als Argument. 3) Es ermöglicht eine Prädikatfunktion definiert werden und als Parameter an eine andere Funktion übergeben. 4) Es ist ein Spezialfall eines Func, dass es nur einen einzigen Parameter und gibt immer einen Bool.

In C # Namespace:

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

Es ist im System-Namespace definiert.

Wo sollen wir Prädikat Delegate verwenden?

Wir sollen Prädikat Delegierten in folgenden Fällen:

1) Für Elemente in einer generischen Sammlung suchen.   z.B.

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

2) Grund Beispiel, das den Code verkürzt und gibt wahr oder falsch:

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

Jetzt, Rufen oben Prädikat:

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

3) Eine anonyme Methode kann auch als unten an ein Prädikat Delegattyp zugewiesen werden:

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

Alle Best Practices über Prädikate?

Mit Func, Lambda-Ausdrücke und Delegaten statt Prädikaten.

Die Prädikat basierte Suchverfahren ermöglichen einem Verfahren zu delegieren oder Lambda-Ausdruck, um zu entscheiden, ob ein bestimmtes Element ist ein „Spiel.“  Ein Prädikat ist einfach ein Delegat ein Objekt zu akzeptieren und Rückkehr wahr oder falsch: public delegate bool Predicate (T-Objekt);

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

Wenn Sie in VB 9 (VS2008) sind, ein Prädikat kann eine komplexe Funktion sein:

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

Oder Sie können Ihr Prädikat als Lambda, solange es nur ein Ausdruck schreiben

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

Prädikat fällt unter der Kategorie von generisch Delegierten in C #. Dies wird mit einem Argument aufgerufen und immer boolean Typ zurück. Grundsätzlich wird das Prädikat verwendet, um die Bedingung zu testen - wahr / falsch. Viele Klassen unterstützen Prädikat als Argument. Für z.B. list.findall erwartet, dass die Parameter Prädikat. Hier ist ein Beispiel für das Prädikat.

Stellen Sie sich einen Funktionszeiger mit der Signatur -

bool Delegat MyDelegate (T Spiel);

Hier ist das Beispiel

Node.cs

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

Hauptklasse -

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

A Delegierten definieren einen Referenztyp, der verwendet werden kann, ein Verfahren mit einer bestimmten Signatur zu verkapseln. C # Delegaten Lebenszyklus: Der Lebenszyklus von C # Delegaten ist

  • Erklärung
  • Instanziierung
  • INVACATION

mehr Form lernen   http : //asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top