নেট নেট HashSet<T>
এবং এর List<T>
মধ্যে পার্থক্য কী তা ব্যাখ্যা করতে পারেন ?
কোন কোন মামলার HashSet<T>
বিরুদ্ধে অগ্রাধিকার দেওয়া উচিত বলে আপনি উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন List<T>
?
নেট নেট HashSet<T>
এবং এর List<T>
মধ্যে পার্থক্য কী তা ব্যাখ্যা করতে পারেন ?
কোন কোন মামলার HashSet<T>
বিরুদ্ধে অগ্রাধিকার দেওয়া উচিত বলে আপনি উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন List<T>
?
উত্তর:
একটি লিস্টের বিপরীতে <> ...
একটি হ্যাশসেট এমন একটি তালিকা যাঁর সদৃশ সদস্য নেই।
যেহেতু একটি হ্যাশসেটটি কেবল অনন্য এন্ট্রি ধারণ করতে বাধ্য, তাই অভ্যন্তরীণ কাঠামোটি অনুসন্ধানের জন্য অনুকূলিত করা হয়েছে (তালিকার সাথে তুলনা করে) - এটি যথেষ্ট দ্রুত
হ্যাশসেটে যুক্ত করা একটি বুলিয়ান দেয় - সেটটিতে ইতিমধ্যে বিদ্যমান থাকার কারণে সংযোজন ব্যর্থ হলে মিথ্যা
কোনও সেটের বিপরীতে গাণিতিক সেট ক্রিয়াকলাপ সম্পাদন করতে পারে: ইউনিয়ন / ছেদ / ইসসুবসটঅফ ইত্যাদি
হ্যাশসেট কেবলমাত্র আইকোলিকেশন আইলিস্ট প্রয়োগ করে না
আপনি কোনও হ্যাশসেটের সাথে সূচকগুলি ব্যবহার করতে পারবেন না, কেবল গণনাকারী।
হ্যাশসেট ব্যবহারের মূল কারণটি যদি আপনি সেট ক্রিয়াকলাপ সম্পাদন করতে আগ্রহী হন।
2 সেট দেওয়া হয়েছে: হ্যাশসেট 1 এবং হ্যাশসেট 2
//returns a list of distinct items in both sets
HashSet set3 = set1.Union( set2 );
লিনকিউ ব্যবহার করে সমতুল্য অপারেশনের তুলনায় উড়ে যায় এটা লেখার চেয়েও সুন্দর!
Union
পদ্ধতিতে সমস্যা ছিল । আমি UnionWith
পরিবর্তে ব্যবহার করেছিলাম ।
আরও সুনির্দিষ্ট হতে উদাহরণস্বরূপ প্রদর্শন করতে দেয়,
আপনি নীচের উদাহরণে হ্যাশসেট ব্যবহার করতে পারবেন না।
HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
for (int i = 0; i < hashSet1.Count; i++)
Console.WriteLine(hashSet1[i]);
hashSet1[i]
একটি ত্রুটি উত্পাদন করতে হবে:
'সিস্টেম.কলেশন.জেনারিক.হ্যাশসেট' টাইপের অভিব্যক্তিতে [] এর সাথে সূচীকরণ প্রয়োগ করতে পারে না
আপনি ভবিষ্যদ্বাণী বিবৃতি ব্যবহার করতে পারেন:
foreach (var item in hashSet1)
Console.WriteLine(item);
তালিকাগুলি আপনাকে এটি করতে দেয় এবং আপনি হ্যাশসেটে কোনও আইটেম যুক্ত করার সময়, আপনি আইটেমটি অন্তর্ভুক্ত করেন কি না তা পরীক্ষা করতে পারবেন এবং আপনি হ্যাশসেটে নকল আইটেমগুলি যুক্ত করতে পারবেন না।
HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
if (hashSet1.Add("1"))
Console.WriteLine("'1' is successfully added to hashSet1!");
else
Console.WriteLine("'1' could not be added to hashSet1, because it contains '1'");
HashSet মত কিছু দরকারী ফাংশন আছে IntersectWith
, UnionWith
, IsProperSubsetOf
, ExceptWith
, SymmetricExceptWith
ইত্যাদি
IsProperSubsetOf
:
HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
HashSet<string> hashSet3 = new HashSet<string>() { "1", "2", "3", "4", "5" };
if (hashSet1.IsProperSubsetOf(hashSet3))
Console.WriteLine("hashSet3 contains all elements of hashSet1.");
if (!hashSet1.IsProperSubsetOf(hashSet2))
Console.WriteLine("hashSet2 does not contains all elements of hashSet1.");
UnionWith
:
HashSet<string> hashSet1 = new HashSet<string>() { "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
hashSet1.UnionWith(hashSet2); //hashSet1 -> 3, 2, 4, 6, 8
IntersectWith
:
HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" }
hashSet1.IntersectWith(hashSet2);//hashSet1 -> 4, 8
ExceptWith
:
HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
hashSet1.ExceptWith(hashSet2);//hashSet1 -> 5, 6
SymmetricExceptWith
:
HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
hashSet1.SymmetricExceptWith(hashSet2);//hashSet1 -> 4, 5, 6
যাইহোক, আদেশটি হ্যাশসেটগুলিতে সংরক্ষিত নেই। উদাহরণস্বরূপ, আমরা উপাদানটি "2" শেষ যোগ করেছি তবে এটি দ্বিতীয় ক্রমে রয়েছে:
HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
hashSet1.Add("1"); // 3, 4, 8, 1
hashSet1.Remove("4"); // 3, 8, 1
hashSet1.Add("2"); // 3, 2 ,8, 1
এ HashSet<T>
হ'ল একটি ক্লাস যা আপনাকে O(1)
কন্টেন্টমেন্টের জন্য চেহারা দেওয়ার জন্য ডিজাইন করা হয়েছে (অর্থাত্ এই সংগ্রহে কোনও নির্দিষ্ট বিষয় রয়েছে এবং আমাকে দ্রুত উত্তরটি বলুন)।
এ List<T>
হ'ল একটি শ্রেণি যা আপনাকে O(1)
গতিময়ভাবে বাড়তে পারে তার চেয়ে এলোমেলো অ্যাক্সেস সহ একটি সংকলন দেওয়ার জন্য ডিজাইন করা হয়েছে (ভাবুন গতিশীল অ্যারে)। আপনি O(n)
সময় মতো সংযোজন পরীক্ষা করতে পারেন ( তালিকাগুলি বাছাই না করা হলে আপনি O(log n)
সময়মতো বাইনারি অনুসন্ধান করতে পারেন )।
কোন কোন মামলার
HashSet<T>
বিরুদ্ধে অগ্রাধিকার দেওয়া উচিত তার একটি উদাহরণ দিয়ে আপনি ব্যাখ্যা করতে পারেনList<T>
আপনি যখন কন্টেন্টটি পরীক্ষা করতে চান O(1)
।
List<T>
আপনি যখন চান একটি ব্যবহার করুন :
আপনি যদি চান যে আইটেমটির সূচকটি জানেন (তবে আইটেমটির মানের চেয়ে) পুনরুদ্ধার O(1)
। যদি আপনি সূচকটি জানেন না, আইটেমটি সন্ধানে O(n)
একটি অরসেটেড সংগ্রহের জন্য আরও সময় লাগে ।
Hashset<T>
আপনি যখন চান একটি ব্যবহার করুন :
আপনি যে জিনিসটি সন্ধান করতে চান তার নামটি যদি আপনি জানেন তবে লিকআপ হ'ল O(1)
(এটি 'হ্যাশ' অংশ)। এটি করণের মতো অর্ডার বজায় রাখে List<T>
না এবং আপনি সদৃশগুলি সংরক্ষণ করতে পারবেন না (ডুপ্লিকেট যুক্ত করার কোনও প্রভাব নেই, এটি 'সেট' অংশ)।
Hashset<T>
স্ক্র্যাবলের কোনও খেলায় খেলে শব্দটি ইংরেজি (বা অন্য ভাষায়) একটি বৈধ শব্দ কিনা তা আপনি যদি জানতে চান তবে কখন এটি ব্যবহার করবেন তার একটি উদাহরণ। আরও ভাল যদি আপনি কোনও ওয়েব সার্ভিস যেমন কোনও গেমের অনলাইন সংস্করণে সমস্ত দৃষ্টান্ত ব্যবহার করে তৈরি করতে চান।
একজন List<T>
খেলোয়াড় স্কোর ট্র্যাক করতে স্কোরবোর্ড তৈরি করার জন্য একটি ভাল ডাটা স্ট্রাকচার হবে।
তালিকা একটি আদেশ তালিকা। এইটা
হ্যাশসেট একটি সেট। এটা তোলে:
আপনি যখন সংগ্রহটি অ্যাক্সেস করতে চান তখন তালিকাটি আরও উপযুক্ত হয় যদিও এটি এমন কোনও অ্যারের মতো ছিল যা আপনি আইটেমগুলিতে সংযোজন, সন্নিবেশ এবং সরাতে পারবেন। যদি আপনি আপনার সংগ্রহটিকে আইটেমগুলির "ব্যাগ" এর মতো আচরণ করতে চান তবে অর্ডারটি গুরুত্বপূর্ণ নয় বা যখন আপনি ইন্টারসেকটভিথ বা ইউনিয়নভিথের মতো ক্রিয়াকলাপগুলি ব্যবহার করে অন্যান্য সেটগুলির সাথে এটি তুলনা করতে চান তবে হ্যাশসেট একটি ভাল পছন্দ।
তালিকা অগত্যা অনন্য নয়, তবে হ্যাশসেট একের জন্য।
একটি তালিকা হ'ল টাইপ টি-এর অবজেক্টগুলির অর্ডারযুক্ত সংগ্রহ যা কোনও অ্যারের থেকে আলাদা নয় আপনি এন্ট্রি যোগ এবং মুছে ফেলতে পারেন।
আপনি সদস্যদের রেফারেন্স করতে চান এমন একটি তালিকা আপনি ব্যবহার করবেন যেখানে আপনি সেগুলি সংরক্ষণ করেছেন এবং আপনি আইটেমের পরিবর্তে কোনও অবস্থানের দ্বারা সেগুলিতে অ্যাক্সেস করছেন।
একটি হ্যাশসেট একটি অভিধানের মতো যা আইটেমটি নিজেই মূল এবং সেই সাথে মানও, অর্ডারিং গ্যারান্টিযুক্ত নয়।
আপনি কোনও হ্যাশসেট ব্যবহার করবেন যেখানে আপনি পরীক্ষা করতে চান যে কোনও বস্তু সংগ্রহে রয়েছে
List
একটি অর্ডার বজায় রাখে (যেমন জিনিসগুলি যুক্ত করার সময়), তবে স্বয়ংক্রিয়ভাবে আইটেমগুলি বাছাই করে না। আপনাকে কল করতে হবে .Sort
বা একটি ব্যবহার করতে হবে SortedList
।
আপনি যদি ডেটা-চালিত বিকাশের ক্ষেত্রে এই ডেটা স্ট্রাকচারকে প্রকৃত ব্যবহারের জন্য প্রয়োগ করার সিদ্ধান্ত নেন তবে ডেটা সাফাই এবং মাইগ্রেশনের জন্য একটি হ্যাশসেট ডেটা অ্যাডাপ্টারের উত্সগুলির বিরুদ্ধে প্রতিলিপি পরীক্ষা করতে খুব সহায়ক।
এছাড়াও, যদি ডাটাঅনোটেশন ক্লাস ব্যবহার করা হয় তবে শ্রেণীর বৈশিষ্ট্যগুলিতে মূল যুক্তি প্রয়োগ করা যেতে পারে এবং একটি হ্যাশসেটের সাহায্যে একটি প্রাকৃতিক সূচক (ক্লাস্টারড বা না) কার্যকরভাবে নিয়ন্ত্রণ করা যায়, যেখানে তালিকাগুলি বাস্তবায়নে এটি খুব কঠিন হবে।
একটি তালিকা ব্যবহারের জন্য একটি শক্তিশালী বিকল্প হ'ল মডেলটিতে একাধিক মাধ্যমের জন্য জেনেরিকগুলি প্রয়োগ করা, যেমন কোনও ড্রপডাউনলিস্ট সহায়তাকারীর জন্য এমভিসি ভিউতে ক্লাসগুলির তালিকা পাঠানো এবং ওয়েবএপি-র মাধ্যমে জেএসএন কনস্ট্রাক্ট হিসাবে প্রেরণের জন্য। তালিকাটি সাধারণ শ্রেণীর সংগ্রহের যুক্তিকে মঞ্জুরি দেয় এবং আরও একটি "ইন্টারফেস" এর মতো নমনীয়তা রাখে যেমন একক দর্শন মডেলকে বিভিন্ন মাধ্যমের সাথে গণনা করার পদ্ধতির approach