সি # তে প্রতিনিধিদের পূর্বাভাস


256

তুমি কি আমাকে ব্যখ্যা করতে পার:

  • প্রিডিকেট ডেলিগেট কী?
  • কোথায় আমাদের পূর্বাভাস ব্যবহার করা উচিত?
  • পূর্বাভাস ব্যবহার করার সময় কোনও সেরা অনুশীলন?

বর্ণনামূলক উত্স কোড প্রশংসা করা হবে।

উত্তর:


319

একটি শিকারী একটি ফাংশন যা ফিরে আসে trueবা আসে false। একটি শিকারী প্রতিনিধি একটি প্রাকটিক্সের একটি রেফারেন্স।

সুতরাং মূলত একটি শিকারী প্রতিনিধি হ'ল এমন ফাংশনটির একটি রেফারেন্স যা ফিরে আসে trueবা আসে false। ভবিষ্যদ্বাণীগুলি মানগুলির একটি তালিকা ফিল্টার করার জন্য খুব দরকারী - এখানে একটি উদাহরণ।

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

এখন আপনি যদি সি # 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
@ অ্যান্ড্রুহারে, ব্যবহারকারীর দ্বারা মূল্য কোথায় প্রবেশ করা হয়েছে তার i > valপরিবর্তে এটি কি সম্ভব ? i > 2val
্যা

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

একটি প্রতিনিধি যা একটি বুলিয়ান দেয় returns ফিল্টারিং তালিকাগুলিতে এটি প্রচুর ব্যবহৃত হয় তবে আপনি যেখানে খুশি সেখানে ব্যবহার করতে পারেন।

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

9

সেখানে predicates উপর একটি ভাল নিবন্ধ এর এখানে , যদিও এটি .NET2 যুগের তাই সেখানে ল্যামডা এক্সপ্রেশন কোনো উল্লেখ নেই সেখানে।


আপনার উত্তরের লিঙ্কটি আর কোনও আসল নিবন্ধের সাথে লিঙ্ক করবে না
ডেভিড ক্র্যাম

@ ডেভিড ক্র্যাম: ধন্যবাদ, আমি ওয়েবব্যাক মেশিনটি ব্যবহার করার জন্য লিঙ্কটি আপডেট করেছি, যদিও নিবন্ধটি আজকাল সত্যই তারিখের দিকে দেখছে ।
লুক এইচ

6

প্রিডিকেট ডেলিগেট কী?

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

পূর্বাভাস সম্পর্কে কোন সেরা অনুশীলন?

পূর্বাভাসের পরিবর্তে ফানক, লাম্বদা এক্সপ্রেশন এবং প্রতিনিধি ব্যবহার করুন।


5

পূর্বাভাস ভিত্তিক অনুসন্ধানের পদ্ধতিগুলি কোনও পদ্ধতি প্রতিনিধি বা ল্যাম্বডা এক্সপ্রেশনটিকে প্রদত্ত উপাদানটি "ম্যাচ" কিনা তা সিদ্ধান্ত নিতে দেয়। একটি শিকারী হ'ল একটি প্রতিনিধি কোনও জিনিস গ্রহণ করে সত্য বা মিথ্যা ফিরিয়ে দেয়: পাবলিক ডেলিগেট বুল প্রিডিকেট (টি অবজেক্ট);

   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

আপনি যদি ভিবি 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)

0

ভবিষ্যদ্বাণীটি সি # তে জেনেরিক প্রতিনিধিদের বিভাগে আসে। এটিকে একটি যুক্তি দিয়ে ডাকা হয় এবং সর্বদা বুলিয়ান প্রকারটি ফেরত দেয়। মূলত, শিকারটি শর্তটি পরীক্ষা করতে ব্যবহৃত হয় - সত্য / মিথ্যা। অনেক শ্রেণি আর্গুমেন্ট হিসাবে প্রিকেট সমর্থন করে। উদাহরণস্বরূপ 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

একটি প্রতিনিধি একটি রেফারেন্স টাইপ সংজ্ঞায়িত করে যা কোনও নির্দিষ্ট স্বাক্ষর সহ কোনও পদ্ধতি আবদ্ধ করতে ব্যবহৃত হতে পারে। সি # প্রতিনিধি জীবনচক্র: সি # প্রতিনিধিদের জীবনচক্র

  • ঘোষণা
  • ইনস্ট্যান্স
  • ছুটিতে

আরও ফর্মটি শিখুন http://asp-net-by-parijat.blogspot.in/2015/08/ কি-is-delegates-in-c-how-to-declare.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.