নিম্নলিখিত লিনকিউ বিবৃতিটি কীভাবে কাজ করে?
আমার কোডটি এখানে:
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
?
নিম্নলিখিত লিনকিউ বিবৃতিটি কীভাবে কাজ করে?
আমার কোডটি এখানে:
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
?
উত্তর:
আউটপুট 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);
}
.First()
, .FirstOrDefault()
, .Single()
এবং .SingleOrDefault()
এছাড়াও ক্যোয়ারী মূল্যায়ন আরম্ভ।
স্থগিতাদেশ কার্যকর হওয়ার কারণে এটি ঘটেছে, যার অর্থ হ'ল অভিব্যক্তির গণনা কোনও জায়গায় প্রয়োজন না হওয়া পর্যন্ত কার্যকর করা হয় না। ডেটা খুব বড় হলে পারফরম্যান্স আরও ভাল হয়।
এর কারণ হ'ল আপনার ল্যাম্বদা এক্সপ্রেশনটি স্থগিত করা। আপনি পূর্বাঞ্চ লুপে পুনরাবৃত্তি শুরু করার সময় ক্যোয়ারি কার্যকর করা হয়।
পিছিয়ে দেওয়া কার্যকর হওয়ার কারণে আপনি এই ফলাফলটি পাচ্ছেন যার অর্থ ফলাফলটি প্রথম অ্যাক্সেস না হওয়া পর্যন্ত মূল্যায়ন করা হয় না।
এটি আরও স্পষ্ট করতে আপনার স্নিপেটের শেষে তালিকায় 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
কোনও ফলাফলের মধ্যে থাকবে না ।