c# - सी#में प्रतिनिधियों का अनुमान




.net predicate (6)

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

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

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

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

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

सभी उत्तरों के लिए धन्यवाद!


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

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

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


भविष्यवाणी एक कार्यात्मक निर्माण है जो मूल रूप से परीक्षण करने का एक सुविधाजनक तरीका प्रदान करता है यदि किसी दिए गए टी ऑब्जेक्ट के बारे में कुछ सच है।

उदाहरण के लिए, मान लीजिए मेरे पास कक्षा है:

    class Person {
          public string Name { get; set; }
          public int Age { get; set; }
         }

अब मान लें कि मेरे पास एक सूची लोग हैं और मैं जानना चाहता हूं कि सूची में ऑस्कर नामक कोई है या नहीं।

एक भविष्यवाणी (या लिंक, या उस फैंसी सामान में से किसी भी) का उपयोग किए बिना, मैं इसे निम्नलिखित करके हमेशा पूरा कर सकता हूं:

    Person oscar = null;
    foreach (Person person in people) {
      if (person.Name == "Oscar") {
      oscar = person;
      break;
    }
  }

 if (oscar != null) {
 // Oscar exists!
}

यह ठीक है, लेकिन फिर मान लें कि मैं जांचना चाहता हूं कि "रूथ" नामक कोई व्यक्ति है या नहीं? या एक व्यक्ति जिसका उम्र 17 है?

एक भविष्यवाणी का उपयोग करके, मैं इन चीजों को बहुत कम कोड का उपयोग कर पा सकता हूं:

Predicate<Person> oscarFinder = (Person p) => { return p.Name == "Oscar"; };
Predicate<Person> ruthFinder = (Person p) => { return p.Name == "Ruth"; };
Predicate<Person> seventeenYearOldFinder = (Person p) => { return p.Age == 
17; };

Person oscar = people.Find(oscarFinder);
Person ruth = people.Find(ruthFinder);
Person seventeenYearOld = people.Find(seventeenYearOldFinder);

नोटिस मैंने बहुत कम कोड कहा, बहुत तेज नहीं। आम गलत धारणा डेवलपर्स यह है कि अगर कुछ एक पंक्ति लेता है, तो उसे दस लाइनों की तुलना में बेहतर प्रदर्शन करना चाहिए। लेकिन दृश्यों के पीछे, खोज विधि, जो एक भविष्यवाणी लेती है, बस सब के बाद गणना कर रही है। लिंकक की कार्यक्षमता के लिए भी यही सच है।

तो आइए अपने प्रश्न में विशिष्ट कोड देखें:

Predicate<int> pre = delegate(int a){ return a % 2 == 0; };

यहां हमारे पास एक पूर्वानुमान पूर्व है जो एक int लेता है और% 2 == 0 देता है।

यह अनिवार्य रूप से एक संख्या के लिए परीक्षण कर रहा है। इसका क्या अर्थ है:

pre(1) == false;
pre(2) == true;

और इसी तरह। इसका मतलब यह भी है कि, यदि आपके पास एक सूची इन्ट्स है और आप पहले नंबर भी खोजना चाहते हैं, तो आप यह कर सकते हैं:

int firstEven = ints.Find(pre);

बेशक, जैसा कि आप कोड में उपयोग कर सकते हैं किसी भी अन्य प्रकार के साथ, अपने चर वर्णनात्मक नाम देने के लिए एक अच्छा विचार है; इसलिए मैं ऊपर की ओर कुछ को बदलने की सलाह दूंगा जैसे कि फाइंडर या इवन - उन पंक्तियों के साथ कुछ। फिर उपरोक्त कोड बहुत स्पष्ट है:

int firstEven = ints.Find(evenFinder);

यदि आप वीबी 9 (वीएस -2008) में हैं, तो एक अनुमान एक जटिल कार्य हो सकता है:

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)

सी # 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;
                           });
    }
}

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


भविष्यवाणी प्रतिनिधि क्या है?

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

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

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

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

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

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

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

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

भविष्यवाणियों के बजाय Func, Lambda अभिव्यक्तियों और प्रतिनिधियों का उपयोग करें।





predicate