ফানকের ব্যাখ্যা


90

আমি ভাবছিলাম যে কেউ কী Func<int, string>কী এবং কীভাবে এটি কিছু পরিষ্কার উদাহরণ দিয়ে ব্যবহার করা হয় তা ব্যাখ্যা করতে পারে ।

উত্তর:


146

আপনি সাধারণত প্রতিনিধিদের সাথে পরিচিত? ডেলিগেটস এবং ইভেন্টগুলি সম্পর্কে আমার একটি পৃষ্ঠা রয়েছে যা যদি না সহায়তা করতে পারে তবে এটি উভয়ের মধ্যে পার্থক্য ব্যাখ্যা করার জন্য আরও তত্পর।

Func<T, TResult>কেবলমাত্র একটি জেনেরিক প্রতিনিধি - ঘোষণাপত্রের সাথে সম্পর্কিত ধরণের আর্গুমেন্ট ( এবং ) প্রকারের পরামিতিগুলি ( Tএবং TResult) প্রতিস্থাপন করে কোনও নির্দিষ্ট পরিস্থিতিতে এর অর্থ কী তা নিয়ে কাজ করুন । বিভ্রান্তি এড়াতে আমি এর নামও দিয়েছি:intstring

string ExpandedFunc(int x)

অন্য কথায়, Func<int, string>একটি প্রতিনিধি যা কোনও intআর্গুমেন্ট গ্রহণ করে এবং ফিরিয়ে দেয় এমন একটি ফাংশনকে প্রতিনিধিত্ব করে string

Func<T, TResult>অনুমান এবং পূর্বাভাসের জন্য প্রায়শই লিনকিউতে ব্যবহৃত হয় (পরবর্তী ক্ষেত্রে TResultসর্বদা সর্বদা bool)। উদাহরণস্বরূপ, আপনি Func<int, string>একটি স্ট্রিংয়ের অনুক্রমের সাথে পূর্ণসংখ্যার ক্রমটি প্রজেক্ট করতে ব্যবহার করতে পারেন । লাম্বডা এক্সপ্রেশনগুলি সাধারণত লিনকিউতে প্রাসঙ্গিক প্রতিনিধি তৈরি করতে ব্যবহৃত হয়:

Func<int, string> projection = x => "Value=" + x;
int[] values = { 3, 7, 10 };
var strings = values.Select(projection);

foreach (string s in strings)
{
    Console.WriteLine(s);
}

ফলাফল:

Value=3
Value=7
Value=10

4
"অন্য কথায়, এটি একটি প্রতিনিধি যা কোনও ফাংশন উপস্থাপন করে কোন যুক্তি গ্রহণ করে স্ট্রিং ফিরিয়ে দেয়" " কেবল অন্যের জন্য বিভ্রান্তি এড়াতে আমি পরিষ্কার করব যে আপনি এখানে ফানক <টি, স্ট্রিং> এবং ফানক <টি, ট্রসাল্ট> এর কথা বলছেন না। আপনি যদি জেনেরিক প্রকার এবং প্রতিনিধি বোঝেন তবে এটি স্পষ্ট হয় তবে যারা ফন্ট << int / স্ট্রিং> না করেন তাদের পক্ষে এটি এমন কোনও ফাংশনটিতে কান প্রেরণ করে যা কোনও যুক্তি গ্রহণ করে এবং একটি স্ট্রিং ফিরিয়ে দেয়।
আসল নেপস্টার

আমি পরে যখন পিসিতে ফিরে আসছি তখন স্পষ্ট করে দেবে।
জন স্কিটি

4
আমি মনে করি এটি এমএসডিএন এর বর্ণনা এবং উদাহরণের মতো পরিষ্কার নয়। আমি এও ভাবি যে আপনার সর্বশেষ প্রকারের পরম কীভাবে ফিরে আসার প্রকার তা সম্পর্কে তথ্য যুক্ত করা উচিত - এটি স্পষ্ট করে যে ফানক <ইন, ইন, স্ট্রিং> স্ট্রিং দেয় এবং 2 টি ইনস নেয়। এটি পরিষ্কার করতে সহায়তা করে। ব্যক্তিগত কিছুই নয় - আমি কেবল এটি যথেষ্ট পরিস্কার বলে মনে করি নি।
TheSoftwareJedi

11
সুতরাং আপনি কি আপনার প্রতিটি প্রিয় উত্তরকে নীচে নামাতে যাচ্ছেন যা আপনি নিজের বিশেষ প্রিয় হিসাবে তেমন সহায়ক না বলে মনে করছেন? এই উত্তরটি কি সক্রিয়ভাবে অরক্ষিত , আপনি কি ভাবেন? আপনি কি মনে করেন যে জিনিসগুলি দেখার জন্য একাধিক উপায় থাকা খারাপ ধারণা হতে পারে না?
জন স্কিটি

8
@TheSoftwareJedi: - যে আপনি কোন, অবশ্যই, কোনো কারণ আপনার downvote ব্যক্তিগতভাবে নেওয়া করেনি শনিবার ব্যক্তিগত কারণে downvote এবং তারপর মাত্র ঘটেছে পর আমরা যথাযথ আচরণ সম্পর্কে ইমেল একটি দীর্ঘ আলোচনার কাটাচ্ছি এই থ্রেড আসতে হয় সম্পূর্ণরূপে সদৃশ, তাই না?
জন স্কিটি

40

একটি Func<int, string>ints খায় এবং স্ট্রিং প্রদান করে। সুতরাং, কী কী খায় এবং স্ট্রিংগুলি ফেরত দেয়? এই সম্পর্কে ...

public string IntAsString( int i )
{
  return i.ToString();
}

সেখানে, আমি সবেমাত্র একটি ফাংশন করেছি যা ints খায় এবং স্ট্রিংগুলি ফেরত দেয়। আমি কীভাবে এটি ব্যবহার করব?

var lst = new List<int>() { 1, 2, 3, 4, 5 };
string str = String.Empty;

foreach( int i in lst )
{
  str += IntAsString(i);
}

// str will be "12345"

খুব সেক্সি নয়, আমি জানি, তবে এটি সহজ ধারণা যে প্রচুর কৌশল অবলম্বন করা হয়। এখন, এর পরিবর্তে একটি ফানক ব্যবহার করা যাক।

Func<int, string> fnc = IntAsString;

foreach (int i in lst)
{
  str += fnc(i);
}

// str will be "1234512345" assuming we have same str as before

প্রতিটি সদস্যকে ইনএএসস্ট্রিং কল করার পরিবর্তে, আমি এফএনসি নামে একটি রেফারেন্স তৈরি করেছি (পদ্ধতিগুলির এই উল্লেখগুলিকে প্রতিনিধি বলা হয় ) এবং পরিবর্তে এটি ব্যবহার করেছি। (মনে রাখবেন fnc ইনট খায় এবং স্ট্রিংগুলি দেয়)।

এই উদাহরণটি খুব সেক্সি নয়, তবে আপনি দেখতে পাবেন এক টন চালাক স্টাফগুলি ফাংশন, ডেলিগেটস এবং এক্সটেনশন পদ্ধতির সাধারণ ধারণার উপর ভিত্তি করে ।

আমি দেখেছি এই স্টাফের সেরা প্রাইমারগুলির মধ্যে একটি এখানে । তিনি আরও অনেক বাস্তব উদাহরণ পেয়েছেন। :)


@ থেরিয়ালনাপস্টার আমি এটি পছন্দ করি তবে আমি আপনার নামটি আরও পছন্দ করি।
বিকেএসপুরগাঁও

28

এটি এমন একটি প্রতিনিধি যা একজনকে intপ্যারামিটার হিসাবে নেয় এবং ধরণের মান দেয় string

এটির ব্যবহারের উদাহরণ এখানে:

using System;

class Program
{
    static void Main()
    {
        Func<Int32, String> func = bar;

        // now I have a delegate which 
        // I can invoke or pass to other
        // methods.
        func(1);
    }

    static String bar(Int32 value)
    {
        return value.ToString();
    }
}

4
ধন্যবাদ অ্যান্ড্রু আপনি কি বার (1) এর পরিবর্তে ফানক (1) লিখতে চান?
zSynopsis

1

Func<int, string>কোন মান মান প্যারামিটার গ্রহণ করে এবং একটি স্ট্রিংয়ের মান দেয়। এখানে একটি উদাহরণ যেখানে অতিরিক্ত সমর্থন পদ্ধতি অপ্রয়োজনীয়।

Func<int, string> GetDogMessage = dogAge =>
        {
            if (dogAge < 3) return "You have a puppy!";
            if (dogAge < 7) return "Strong adult dog!";

            return "Age is catching up with the dog!";
        };

string youngDogMessage = GetDogMessage(2);

দ্রষ্টব্য: ফানকের সর্বশেষ অবজেক্টের ধরণ (উদাহরণস্বরূপ "স্ট্রিং" এই ফাংশন) হ'ল ফাংশন রিটার্ন টাইপ (যেমন আদিমগুলিতে সীমাবদ্ধ নয়, তবে কোনও বস্তু)। অতএব, Func<int, bool, float>ইনট এবং বুল মান প্যারামিটারগুলি গ্রহণ করে এবং একটি ভাসমান মান প্রদান করে।

Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
        {
            if(intValue > 100 && boolValue) return 100;

            return 1;
        };
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);

এইচটিএইচ

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