এটি লিনকিউ ব্যবহার করে যারা পা ভিজিয়ে চলেছে তাদের পক্ষে এটি একটি পরিচিত সমস্যা:
public class Program
{
public static void Main()
{
IEnumerable<Record> originalCollection = GenerateRecords(new[] {"Jesse"});
var newCollection = new List<Record>(originalCollection);
Console.WriteLine(ContainTheSameSingleObject(originalCollection, newCollection));
}
private static IEnumerable<Record> GenerateRecords(string[] listOfNames)
{
return listOfNames.Select(x => new Record(Guid.NewGuid(), x));
}
private static bool ContainTheSameSingleObject(IEnumerable<Record>
originalCollection, List<Record> newCollection)
{
return originalCollection.Count() == 1 && newCollection.Count() == 1 &&
originalCollection.Single().Id == newCollection.Single().Id;
}
private class Record
{
public Guid Id { get; }
public string SomeValue { get; }
public Record(Guid id, string someValue)
{
Id = id;
SomeValue = someValue;
}
}
}
এটি "মিথ্যা" মুদ্রণ করবে, কারণ প্রতিটি নামের জন্য মূল সংগ্রহটি তৈরি করার জন্য সরবরাহ করা, নির্বাচিত ফাংশনটি Record
পুনরায় মূল্যায়ন করতে থাকে এবং ফলস্বরূপ বস্তুটি নতুনভাবে তৈরি হয়। এটি ঠিক করতে, ToList
শেষে একটি সাধারণ কল যুক্ত করা যেতে পারে GenerateRecords
।
মাইক্রোসফ্ট এইভাবে এটি প্রয়োগ করে কোন লাভের আশা করেছিল?
বাস্তবায়ন কেন কেবল অভ্যন্তরীণ ফলাফলগুলিকে ক্যাশে করবে না? যা ঘটছে তার একটি নির্দিষ্ট অংশটি মুলতুবি কার্যকর হতে পারে, তবে এটি এই আচরণ ছাড়াই বাস্তবায়িত হতে পারে।
একবার লিনকিউ দ্বারা প্রদত্ত কোনও সংগ্রহের কোনও প্রদত্ত সদস্যকে মূল্যায়ন করা গেলে, কোনও অভ্যন্তরীণ রেফারেন্স / অনুলিপি না রেখে, বরং একই ফলাফলটিকে পুনরায় গণনা করে ডিফল্ট আচরণ হিসাবে কী সুবিধা দেওয়া হয়?
বার বার গণনা করা একই সংস্থার একই সদস্যের পক্ষে যুক্তিটিতে একটি বিশেষ প্রয়োজন রয়েছে এমন পরিস্থিতিতে, মনে হয় এটি একটি alচ্ছিক প্যারামিটারের মাধ্যমে নির্দিষ্ট করা যেতে পারে এবং অন্যথায় ডিফল্ট আচরণও করতে পারে। তদ্ব্যতীত, স্থগিত কার্যকর দ্বারা যে গতি সুবিধা অর্জন করা হয় তা অবশেষে একই ফলাফলের পুনরায় গণনা করতে সময় নেয়ায় শেষ পর্যন্ত কেটে ফেলা হয়। অবশেষে এটি লিনকিউতে নতুন যারা তাদের জন্য বিভ্রান্তিকর ব্লক এবং এটি শেষ পর্যন্ত যে কারও প্রোগ্রামে সূক্ষ্ম বাগের দিকে নিয়ে যেতে পারে।
এতে কী সুবিধা রয়েছে এবং মাইক্রোসফ্ট কেন এই আপাতদৃষ্টিতে খুব ইচ্ছাকৃত সিদ্ধান্ত নিয়েছিল?
return listOfNames.Select(x => new Record(Guid.NewGuid(), x)).ToList();
এটি আপনাকে আপনার "ক্যাশেড অনুলিপি" দেয়। সমস্যা সমাধান.