নিম্নলিখিত লিনকিউ বিবৃতিটি কীভাবে কাজ করে?


160

নিম্নলিখিত লিনকিউ বিবৃতিটি কীভাবে কাজ করে?

আমার কোডটি এখানে:

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
    Console.WriteLine(i);
}

আউটপুট: 2, 4, 6, 8

না কেন 2, 4, 6?


102
ক্যোয়ারী এক্সপ্রেশনটির ফলাফল একটি ক্যোয়ারী, ক্যোয়ারীর সম্পাদন নয়।
এরিক লিপার্ট

6
কম তথ্যের জন্য এই প্রশ্নের গৃহীত উত্তর দেখুন ।
ড্যানিয়েল

9
অবশ্যই আপনি এমন একটি শিরোনাম সম্পর্কে ভাবতে পারেন যা আসলে প্রশ্নের সংক্ষিপ্তসার করে।
ম্যাট বল

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

উত্তর:


235

আউটপুট 2,4,6,8কারণ স্থগিত কার্যকর করা হয়

ক্যোরি ভেরিয়েবলটি পুনরুক্ত করা হলে ক্যোরিটি আসলে সম্পাদন করা হয়, যখন ক্যোরি ভেরিয়েবলটি তৈরি হয় না। একে মুলতুবি কার্যকর বলা হয়।

- সুপারোটিম আগরওয়াল, "লিনকুতে ডিফার্ড বনাম তাত্ক্ষণিক জিজ্ঞাসা সম্পাদন"

ইমিডিয়েট ক্যোয়ারি এক্সিকিউশন নামে আরও একটি কার্যকর করা আছে , যা ক্যোয়ারী ফলাফলগুলি ক্যাশে করার জন্য দরকারী। আবার সুপারোটিম আগরওয়াল থেকে:

এমন একটি ক্যোয়ারির তাত্ক্ষণিক প্রয়োগের জন্য জোর করতে যাতে কোনও সিঙ্গলটন মান উৎপন্ন হয় না, আপনি কোনও প্রশ্ন বা ক্যোয়ারী ভেরিয়েবলের উপর ToList(), ToDictionary(), ToArray(), Count(), Average()বা Max()পদ্ধতিটি কল করতে পারেন । এগুলিকে রূপান্তর অপারেটর বলা হয় যা আপনাকে ফলাফলটির একটি অনুলিপি / স্ন্যাপশট তৈরি করতে দেয় এবং কোয়েরিটি পুনরায় সম্পাদন করার প্রয়োজন ছাড়াই আপনি যতবার চান অ্যাক্সেস পান।

আপনি যদি আউটপুটটি চান তা 2,4,6ব্যবহার করুন .ToList():

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
 {
    Console.WriteLine(i);
 }

8
গণনা (), সর্বোচ্চ (), গড় (), যোগফল () এবং সম্ভবত অন্যান্য পদ্ধতি যা পুরো তালিকা বিবেচনায় নিতে হবে, এছাড়াও ক্যোয়ারির মূল্যায়নের কারণ ঘটায়।
কেনে 14

1
আমি প্রায়শই একটি ফিল্টারলিস্ট () পরিবর্তনের পরিবর্তে 'ফিল্টারলিস্ট' রাখার বিষয়ে ভেবেছিলাম, কোনও পদ্ধতি হিসাবে 'ফিল্টারলিস্ট ()' না করে - ধারণাটি হ'ল, আপনি যতবার তালিকার সাথে তালিকাগুলি চান প্রতিবারই কোনও পদ্ধতি কল করার পরিবর্তে এটির উপরে পুনরাবৃত্তি করুন। একটি আকর্ষণীয় হতে পারে, যদি অস্বাভাবিক এবং সম্ভবত অসম্পূর্ণ পারফরম্যান্স অনুযায়ী কাজ করার পদ্ধতি।
কাতানা 314

4
@Sebastian - @ Kenned এর মন্তব্যের উপরন্তু, .First(), .FirstOrDefault(), .Single()এবং .SingleOrDefault()এছাড়াও ক্যোয়ারী মূল্যায়ন আরম্ভ।
স্কটি ডটনেট

4
আপনি কীভাবে 30 সেকেন্ডের চেয়ে কম উত্তর পেয়েছিলেন তা অবাক করে: ডি
এমসি

2
@ এমসি আপনি কেন এই প্রশ্ন জিজ্ঞাসা করছেন তা আমি জানি না। পুরো উত্তর একবারে দেওয়া হয়নি। এটি বেশ কয়েকবার সম্পাদিত হয়েছিল।
অতীশ দিপংকোর - এমভিপি

11

স্থগিতাদেশ কার্যকর হওয়ার কারণে এটি ঘটেছে, যার অর্থ হ'ল অভিব্যক্তির গণনা কোনও জায়গায় প্রয়োজন না হওয়া পর্যন্ত কার্যকর করা হয় না। ডেটা খুব বড় হলে পারফরম্যান্স আরও ভাল হয়।


3
আপনি এটি উপভোগ করতে পারেন, কারণ এটির অর্থ এইও হতে পারে যে আপনার ব্যয়বহুল গণনাটি একাধিকবার কার্যকর করা হচ্ছে। এই ক্ষেত্রে আপনি এমনকি কর্মক্ষমতা ক্ষতি হতে পারে।
হতাশার গ্রিমেস

0

এর কারণ হ'ল আপনার ল্যাম্বদা এক্সপ্রেশনটি স্থগিত করা। আপনি পূর্বাঞ্চ লুপে পুনরাবৃত্তি শুরু করার সময় ক্যোয়ারি কার্যকর করা হয়।


11
টেকনিক্যালি এটা বিলম্বিত সঞ্চালনের এর পুনরুক্তিকারীর না ল্যামডা
ডি স্ট্যানলি

0

আপনি যখন লিনকিউ থেকে প্রাপ্ত একটি আইনিম্যুয়াল <> ব্যবহার করেন, কেবলমাত্র একটি গণক শ্রেণি তৈরি করা হয় এবং আপনি যখন কিছুটা হাঁটার সময় ব্যবহার করেন তখন কেবল পুনরাবৃত্তিটি শুরু হয়।


-1

পিছিয়ে দেওয়া কার্যকর হওয়ার কারণে আপনি এই ফলাফলটি পাচ্ছেন যার অর্থ ফলাফলটি প্রথম অ্যাক্সেস না হওয়া পর্যন্ত মূল্যায়ন করা হয় না।

এটি আরও স্পষ্ট করতে আপনার স্নিপেটের শেষে তালিকায় 10 যোগ করুন এবং তারপরে আবার মুদ্রণ করুন আপনি আউটপুট 10 পাবেন না

     var list = new List<int>{1,2,4,5,6};
    var even = list.Where(m => m%2 == 0).Tolist();
    list.Add(8);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }
//new*
    list.Add(10);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }

আপনি কি আসলেই চেষ্টা করেছিলেন? আমি 10আউটপুট পেতে ।
মার্ক হারড

ভাল ক্যাচ @ মার্কহুর্ড হ্যাঁ যোগ করেনি। টোললিস্ট ()। পোস্টটি সম্পাদিত এখন এটি প্রত্যাশিত আউটপুট দেওয়া উচিত। আমার প্রত্যাশাটি ছিল এক্সপ্রেশনটি তখনই মূল্যায়ন করা হয় যখন আপনি প্রথমবার ভার ব্যবহার করেন তবে মনে হয় এটি
প্রতিবার

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