C # में समर्पित प्रतिनिधि


256

क्या आप मुझे समझा सकते हैं:

  • एक समर्पित प्रतिनिधि क्या है?
  • हमें विधेय का उपयोग कहां करना चाहिए?
  • भविष्यवाणी करते समय किसी भी सर्वोत्तम अभ्यास?

वर्णनात्मक स्रोत कोड की सराहना की जाएगी।

जवाबों:


319

एक विधेय एक फ़ंक्शन है जो रिटर्न करता है trueया false। एक विधेय प्रतिनिधि एक विधेय का संदर्भ है।

इसलिए मूल रूप से एक विधेय प्रतिनिधि एक फ़ंक्शन का संदर्भ है जो वापस लौटता है trueया false। मूल्यों की सूची को छानने के लिए Predicates बहुत उपयोगी हैं - यहां एक उदाहरण है।

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 का उपयोग कर रहे हैं, तो आप एक क्लीनर फैशन में विधेय का प्रतिनिधित्व करने के लिए एक लैम्ब्डा का उपयोग कर सकते हैं:

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

@ और हरे: अपने पहले कोड स्निपेट में, yeild returnइसके बजाय होना चाहिए ? या यह कैसे काम करता है, यह पूरी सूची पर कैसे पुनरावृत्त करता है?
वूडूचाइल्ड

5
@VoodooChild: याद रखें कि बदले में प्रत्येक तत्व के लिए विधेय को बुलाया जाएगा । तो greaterThanTwoहै returnनहीं yield return, क्योंकि यह है FindAllविधि है कि आप के लिए अनुक्रम से निपटने है।
एंड्रयू हरे

1
@AndrewHare, क्या यह संभव है i > val, इसके बजाय i > 2, जहां valउपयोगकर्ता द्वारा दर्ज किया गया मान है।
मौर्य

81

एंड्रयू के जवाब से सी # 2 और सी # 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;
                           });
    }
}

उम्मीद है की यह मदद करेगा।


11

बस एक प्रतिनिधि जो एक बूलियन लौटाता है। इसका उपयोग सूचियों को फ़िल्टर करने में बहुत किया जाता है, लेकिन जहाँ भी आप चाहें उपयोग कर सकते हैं।

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

9

यहाँ पर एक अच्छा लेख लिखा है , हालाँकि यह .NET2 युग से है, इसलिए इसमें लैम्बडा के भावों का कोई उल्लेख नहीं है।


आपके उत्तर की कड़ी अब वास्तविक लेख से नहीं
जुड़ती है

@ डेविड क्रैम: धन्यवाद, मैंने वेकबैक मशीन का उपयोग करने के लिए लिंक अपडेट किया है, हालांकि आजकल लेख वास्तव में दिनांकित दिख रहा है।
ल्यूक

6

क्या है प्रेडीकेट डेलीगेट?

1) विधेय एक विशेषता है जो सही या गलत है। यह अवधारणा .net 2.0 ढांचे में आ गई है। 2) इसका उपयोग लंबोदर अभिव्यक्ति (=>) के साथ किया जा रहा है। यह एक तर्क के रूप में सामान्य प्रकार लेता है। 3) यह एक समर्पित फ़ंक्शन को दूसरे फ़ंक्शन के पैरामीटर के रूप में परिभाषित और पारित करने की अनुमति देता है। 4) यह एक विशेष मामला है Func, इसमें यह केवल एक पैरामीटर लेता है और हमेशा एक बूल लौटाता है।

C # नामस्थान में:

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

इसे सिस्टम नेमस्पेस में परिभाषित किया गया है।

हमें Predicate प्रतिनिधि का उपयोग कहाँ करना चाहिए?

हमें निम्नलिखित मामलों में विधेय प्रतिनिधि का उपयोग करना चाहिए:

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

भविष्यवाणी के बारे में कोई सर्वोत्तम प्रथा?

प्रिकेट्स के बजाय फंक, लैंबडा एक्सप्रेशन और डेलिगेट्स का उपयोग करें।


5

समर्पित-आधारित खोज विधियाँ एक विधि प्रतिनिधि या लैम्ब्डा अभिव्यक्ति को यह तय करने की अनुमति देती हैं कि क्या कोई दिया गया तत्व "मैच" है। एक विधेय केवल एक प्रतिनिधि होता है जो किसी वस्तु को स्वीकार करता है और सही या गलत लौटाता है: सार्वजनिक प्रतिनिधि बूल Predicate (T object);

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

2

यदि आप 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

या आप अपने विधेय को लंबोदर के रूप में लिख सकते हैं, जब तक कि यह केवल एक अभिव्यक्ति है:

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

0

प्रेडिकेट C # में सामान्य प्रतिनिधियों की श्रेणी में आता है। इसे एक तर्क के साथ कहा जाता है और हमेशा बूलियन प्रकार वापस करते हैं। मूल रूप से, स्थिति का परीक्षण करने के लिए विधेय का उपयोग किया जाता है - सच / गलत। कई वर्ग तर्क के रूप में विधेय का समर्थन करते हैं। उदाहरण के लिए list.findall पैरामीटर की भविष्यवाणी की अपेक्षा करता है। यहाँ विधेय का एक उदाहरण दिया गया है।

हस्ताक्षर के साथ एक फ़ंक्शन पॉइंटर की कल्पना करें -

बूल प्रतिनिधि myDelegate (टी मैच);

यहाँ उदाहरण है

Node.cs

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

0

बस -> वे क्वेरी के लिए उपयोग की जाने वाली शर्त के आधार पर ट्रू / गलत मान प्रदान करते हैं। ज्यादातर प्रतिनिधियों के साथ प्रयोग किया जाता है

सूची का उदाहरण देखें

List<Program> blabla= new List<Program>();
        blabla.Add(new Program("shubham", 1));
        blabla.Add(new Program("google", 3));
        blabla.Add(new Program("world",5));
        blabla.Add(new Program("hello", 5));
        blabla.Add(new Program("bye", 2));

नाम और उम्र शामिल हैं। अब कहते हैं कि हम शर्त पर नाम ढूंढना चाहते हैं इसलिए मैं उपयोग करूंगा,

    Predicate<Program> test = delegate (Program p) { return p.age > 3; };
        List<Program> matches = blabla.FindAll(test);
        Action<Program> print = Console.WriteLine;
        matches.ForEach(print);

इसे सरल रखने की कोशिश की!


-4

एक प्रतिनिधि एक संदर्भ प्रकार को परिभाषित करता है जिसका उपयोग किसी विशिष्ट हस्ताक्षर के साथ एक विधि को संक्षिप्त करने के लिए किया जा सकता है। C # डेलीगेट जीवन चक्र: C # डेलीगेट का जीवन चक्र है

  • घोषणा
  • प्रारंभ
  • छुट्टी में

अधिक जानें फॉर्म http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.