Select
এবং Where
পদ্ধতি Linq পাওয়া যায়। এই দুটি পদ্ধতি সম্পর্কে প্রতিটি বিকাশকারীকে কী জেনে রাখা উচিত? উদাহরণস্বরূপ: কখন একে অপরের ব্যবহার করবেন, একে অপরের উপর ব্যবহারের কোনও সুবিধা ইত্যাদি
Select
এবং Where
পদ্ধতি Linq পাওয়া যায়। এই দুটি পদ্ধতি সম্পর্কে প্রতিটি বিকাশকারীকে কী জেনে রাখা উচিত? উদাহরণস্বরূপ: কখন একে অপরের ব্যবহার করবেন, একে অপরের উপর ব্যবহারের কোনও সুবিধা ইত্যাদি
উত্তর:
কোথায়
মেলে এমন আইটেমগুলি সন্ধান করে এবং কেবল যা ( ফিল্টারিং ) করে তাদের ফিরিয়ে দেয় ।
-> IEnumerable<A>
ইন, IEnumerable<A>
আউট
নির্বাচন করা
উত্সের সমস্ত আইটেমের জন্য কিছু প্রত্যাবর্তন করে ( প্রক্ষেপণ / রূপান্তর )। এটি কোনও জিনিস নিজেরাই হতে পারে তবে এটি সাধারণত কোনও প্রকারের প্রক্ষেপণ jection
-> IEnumerable<A>
ইন, IEnumerable<B>
আউট
Select
তালিকায় সর্বদা একই সংখ্যক উপাদান ফেরত দেবে (আপনার ফিল্টার শর্ত নির্বিশেষে)। Where
আপনার ফিল্টার শর্তের উপর নির্ভর করে কম উপাদান ফিরে আসতে পারে।
Where == filter
এবংSelect == map
নির্বাচন করুন এবং যেখানে দুটি সম্পূর্ণ পৃথক অপারেটর IEnumerable গুলি উপর অভিনয় করছেন ।
প্রথমটি হ'ল আমরা যাকে একটি প্রজেকশন অপারেটর বলি , এবং শেষটিটি একটি সীমাবদ্ধতা অপারেটর ।
এই জাতীয় অপারেটরদের আচরণ সম্পর্কে অন্তর্দৃষ্টি করার একটি আকর্ষণীয় উপায় হ'ল তাদের "কার্যকরী ধরণ" একবার দেখে নেওয়া।
নির্বাচন করুন: (IEnumerable <T1>, ফানক <টি 1, টি 2>) → অনুমানযোগ্য <টি 2> ; এটি ইনপুট হিসাবে উভয়ই লাগে টাইপ টি 1 এর একটি মূল সংখ্যার সমন্বয়যুক্ত উপাদান এবং একটি ফাংশন টি 1 টাইপ টি -2 এর উপাদানগুলিকে টাইপ টি 2 এর উপাদানগুলিতে রূপান্তর করে। আউটপুট টি -2 টাইপের উপাদানযুক্ত একটি অনুমিত is
এটি থেকে সহজেই অনুমান করা যায় যে এই অপারেটর ইনপুটটির প্রতিটি উপাদানগুলিতে ইনপুট ফাংশনটি প্রয়োগযোগ্য এবং তার ফলাফলগুলি একটি নতুন আইনিউমারেবলের মধ্যে গুটিয়ে রেখে তার আউটপুট উত্পাদন করবে।
কিছু গণিতের মতো স্বরলিপি ব্যবহার করে এটি ইনপুট হিসাবে নেয় (a, b, c, ...): অনুমানযোগ্য <T1> এবং f: T1 → T2 এবং উত্পাদন করে (f (a), f (b), f (c) , ...): অনুমানযোগ্য <টি 2>
যেখানে: (অনুমিত <ট 1>, ফানক <টি 1, বুল>) → অনুমানযোগ্য <টি 1> ; এটির জন্য টি 1 টাইপের উপাদানগুলির একটি মূল সংখ্যা রয়েছে এবং টি 1-তে একটি প্রিকিকেট রয়েছে (এটি একটি ফাংশন যা টাইপ টি 1 এর ইনপুটটির জন্য বুলিয়ান ফলাফল তৈরি করে)। আপনি দেখতে পাচ্ছেন যে আউটপুটটি টি -1 টাইপের উপাদানগুলিও রয়েছে n
এবার কেউ অনুমান করতে পারবেন যে ইনপুট IEnumerable এর একটি উপাদান আলেপমেন্টে IEnumerable উপস্থিত থাকবে এলিমেন্টের প্রাকটিকেটের প্রয়োগের ফলাফলের উপর নির্ভর করে n অপারেটর নামের এর শব্দার্থবিজ্ঞানের সাথে এটি যুক্ত করে আপনি নিশ্চিত হতে পারেন যে ইনপুটটি কেবলমাত্র সেই উপাদানগুলির দ্বারা গ্রহণ করা হবে যা ভবিষ্যদ্বাণীটির প্রয়োগের ক্ষেত্রে সত্য হিসাবে মূল্যায়ন করে।
ফাংশনাল প্রোগ্রামিং ব্যাকগ্রাউন্ডযুক্ত লোকেরা সাধারণত এটি চিন্তা করে। এটি আপনাকে কোনও অপারেটর কেবল টাইপটি দেখে কী করে তা কমিয়ে আনার (বা কমপক্ষে অনুমান ...) অনুমতি দেয়!
অনুশীলন হিসাবে, ডকুমেন্টেশন দেখার আগে লিঙ্কউ দ্বারা চিহ্নিত অপারেটরগুলিকে আইইনামেবারেবলগুলিতে প্রবর্তন করার চেষ্টা করুন এবং তাদের আচরণ হ্রাস করুন!
তারা স্বতন্ত্র:
Select
রূপান্তর সম্পর্কে সব ।
Where
ফিল্টারিং সম্পর্কে সব ।
একটি নতুন কাঠামোর একটি গণনাযোগ্য মানচিত্র নির্বাচন করুন। আপনি যদি একটি IEnumerable একটি নির্বাচন সঞ্চালন করেন, আপনি একই সংখ্যক উপাদানগুলির সাথে একটি অ্যারে পাবেন তবে আপনার নির্দিষ্ট করা ম্যাপিংয়ের উপর নির্ভর করে একটি ভিন্ন ধরণ। যেখানে আইনুনামেবল ফিল্টার করে যাতে এটি আপনাকে মূল আইমনামেবলের একটি উপসেট দেয়।
Where
~ = ফিল্টার
Select
~ = মানচিত্র
দুজনেই ফিরবে IEnumerable<T>
আপনি কীভাবে তারা কীভাবে প্রয়োগ করেছেন এবং কীভাবে এক্সটেনশন পদ্ধতিগুলি নির্বাচন করেছেন তা আপনি কীভাবে কাজ করছেন তা অনুমান করতে পারেন ... আমি কোথায় বাস্তবায়ন করার চেষ্টা করেছি এবং এক্সটেনশন পদ্ধতিগুলি নির্বাচন করেছি ... আপনি এটি দেখতে পারেন ...
যেখানে বাস্তবায়ন ::
public static IEnumerable<Tsource> Where<Tsource> ( this IEnumerable<Tsource> a , Func<Tsource , bool> Method )
{
foreach ( var data in a )
{
//If the lambda Expression(delegate) returns "true" Then return the Data. (use 'yield' for deferred return)
if ( Method.Invoke ( data ) )
{
yield return data;
}
}
}
বাস্তবায়ন নির্বাচন করুন ::
public static IEnumerable<TResult> Select<TSource , TResult> ( this IEnumerable<TSource> a , Func<TSource , TResult> Method )
{
foreach ( var item in a )
{
//Each iteration call the delegate and return the Data back.(use 'yield' for deferred return)
yield return Method.Invoke ( item );
}
}
আমার বাস্তবায়ন যে কোনও সংগ্রহের জন্য দুর্দান্ত কাজ করে ... তবে এটি মাইক্রোসফ্ট বাস্তবায়িত এক্সটেনশন পদ্ধতিগুলির থেকে পৃথক, কারণ তারা বাস্তবায়ন করতে এক্সপ্রেশন ট্রি ব্যবহার করে।
এটি নির্বাচন করার ক্ষেত্রে আপনি একটি নতুন কাঠামোর একটি অনুমানযোগ্য মানচিত্র করতে পারেন।
A.Select(x=>new X{UID=x.uid, UNAME=x.uname})
//input as [IEnumerable<A>] --------> return output as [IEnumerable<X> ]
যেখানে () আইইনিউরেবলের ফিল্টার হিসাবে কাজ করে, সেখানে ক্লজটির ভিত্তিতে ফলাফলটি ফিরিয়ে দেবে।
A.Where(x=>x.uid!=0) //input as [IEnumerable<A>] --------> return output as [IEnumerable<A> ]