লিনক: সিলেক্ট এবং কোথাকার মধ্যে পার্থক্য কী


122

Selectএবং Whereপদ্ধতি Linq পাওয়া যায়। এই দুটি পদ্ধতি সম্পর্কে প্রতিটি বিকাশকারীকে কী জেনে রাখা উচিত? উদাহরণস্বরূপ: কখন একে অপরের ব্যবহার করবেন, একে অপরের উপর ব্যবহারের কোনও সুবিধা ইত্যাদি


7
আমি মনে করি না যে এই প্রশ্নটি সিডব্লিউ হিসাবে চিহ্নিত করা উচিত, এটির সম্ভবত একটি সুস্পষ্ট উত্তর থাকতে পারে।
ব্র্যান্ডন 14

1
@ ব্র্যান্ডন যদি কোনও সিডাব্লুউকে উদ্দেশ্যমূলক করে চিহ্নিত করতে ভুল হয় না।
রেক্স এম

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

6
এটিতে প্রচুর ভুল আছে। সিডব্লিউ অকেজো, এবং লোকেরা প্রশ্নগুলি এলোমেলোভাবে
সিডাব্লু

উত্তর:


126

কোথায়

মেলে এমন আইটেমগুলি সন্ধান করে এবং কেবল যা ( ফিল্টারিং ) করে তাদের ফিরিয়ে দেয় ।

-> IEnumerable<A>ইন, IEnumerable<A>আউট

নির্বাচন করা

উত্সের সমস্ত আইটেমের জন্য কিছু প্রত্যাবর্তন করে ( প্রক্ষেপণ / রূপান্তর )। এটি কোনও জিনিস নিজেরাই হতে পারে তবে এটি সাধারণত কোনও প্রকারের প্রক্ষেপণ jection

-> IEnumerable<A>ইন, IEnumerable<B>আউট


15
Selectতালিকায় সর্বদা একই সংখ্যক উপাদান ফেরত দেবে (আপনার ফিল্টার শর্ত নির্বিশেষে)। Whereআপনার ফিল্টার শর্তের উপর নির্ভর করে কম উপাদান ফিরে আসতে পারে।
goku_da_master

এবং এখানে একটি এমএসডিএন উদাহরণ রয়েছে selectএবং এটি এখানে রয়েছেwhere
ইয়াজানপ্রো

কমপক্ষে আমার পক্ষে, অন্যান্য ভাষার সাথে কিছুটা পটভূমি থাকায় এটি ভাবতে সহায়তা করে Where == filterএবংSelect == map
bgusach

52

নির্বাচন করুন এবং যেখানে দুটি সম্পূর্ণ পৃথক অপারেটর 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 অপারেটর নামের এর শব্দার্থবিজ্ঞানের সাথে এটি যুক্ত করে আপনি নিশ্চিত হতে পারেন যে ইনপুটটি কেবলমাত্র সেই উপাদানগুলির দ্বারা গ্রহণ করা হবে যা ভবিষ্যদ্বাণীটির প্রয়োগের ক্ষেত্রে সত্য হিসাবে মূল্যায়ন করে।

ফাংশনাল প্রোগ্রামিং ব্যাকগ্রাউন্ডযুক্ত লোকেরা সাধারণত এটি চিন্তা করে। এটি আপনাকে কোনও অপারেটর কেবল টাইপটি দেখে কী করে তা কমিয়ে আনার (বা কমপক্ষে অনুমান ...) অনুমতি দেয়!

অনুশীলন হিসাবে, ডকুমেন্টেশন দেখার আগে লিঙ্কউ দ্বারা চিহ্নিত অপারেটরগুলিকে আইইনামেবারেবলগুলিতে প্রবর্তন করার চেষ্টা করুন এবং তাদের আচরণ হ্রাস করুন!



18

একটি নতুন কাঠামোর একটি গণনাযোগ্য মানচিত্র নির্বাচন করুন। আপনি যদি একটি IEnumerable একটি নির্বাচন সঞ্চালন করেন, আপনি একই সংখ্যক উপাদানগুলির সাথে একটি অ্যারে পাবেন তবে আপনার নির্দিষ্ট করা ম্যাপিংয়ের উপর নির্ভর করে একটি ভিন্ন ধরণ। যেখানে আইনুনামেবল ফিল্টার করে যাতে এটি আপনাকে মূল আইমনামেবলের একটি উপসেট দেয়।



7

আপনি কীভাবে তারা কীভাবে প্রয়োগ করেছেন এবং কীভাবে এক্সটেনশন পদ্ধতিগুলি নির্বাচন করেছেন তা আপনি কীভাবে কাজ করছেন তা অনুমান করতে পারেন ... আমি কোথায় বাস্তবায়ন করার চেষ্টা করেছি এবং এক্সটেনশন পদ্ধতিগুলি নির্বাচন করেছি ... আপনি এটি দেখতে পারেন ...

যেখানে বাস্তবায়ন ::

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

আমার বাস্তবায়ন যে কোনও সংগ্রহের জন্য দুর্দান্ত কাজ করে ... তবে এটি মাইক্রোসফ্ট বাস্তবায়িত এক্সটেনশন পদ্ধতিগুলির থেকে পৃথক, কারণ তারা বাস্তবায়ন করতে এক্সপ্রেশন ট্রি ব্যবহার করে।


1

এটি নির্বাচন করার ক্ষেত্রে আপনি একটি নতুন কাঠামোর একটি অনুমানযোগ্য মানচিত্র করতে পারেন।

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