সি # সেট সংগ্রহ?


487

Setসি # তে জাভা সংগ্রহের সমতুল্য কোনও কি আছে তা কি কেউ জানেন ? আমি জানি তুমি কিছুটা অনুকরণমূলক একটি সেট একটি ব্যবহার করতে পারেন যে Dictionaryবা HashTableপূর্ণ তবে মানগুলির উপেক্ষা দ্বারা, কিন্তু যে একটি খুব মার্জিত উপায় নেই।

উত্তর:


140

হ্যাশসেট চেষ্টা করুন :

হ্যাশসেট (অফ টি) শ্রেণি উচ্চ-পারফরম্যান্স সেট ক্রিয়াকলাপ সরবরাহ করে। একটি সেট একটি সংগ্রহ যা কোনও সদৃশ উপাদান নেই এবং যার উপাদানগুলি কোনও নির্দিষ্ট ক্রমে নেই ...

একটি হ্যাশসেট (অফ টি) অবজেক্টের ক্ষমতা হ'ল বস্তুটি ধারণ করতে পারে এমন উপাদানগুলির সংখ্যা। একটি হ্যাশসেট (অফ টি) অবজেক্টটির ক্ষমতা স্বয়ংক্রিয়ভাবে বৃদ্ধি পায় কারণ বস্তুটিতে উপাদান যুক্ত করা হয়।

হ্যাশসেট (অফ টি) শ্রেণি গাণিতিক সেটগুলির মডেলের উপর ভিত্তি করে তৈরি করা হয়েছে এবং অভিধানের (অফ টি, টিভিয়ালিউ) বা হ্যাশটেবল সংগ্রহের কীগুলি অ্যাক্সেস করার মতো উচ্চ-পারফরম্যান্স সেট ক্রিয়াকলাপ সরবরাহ করে । সহজ কথায়, হ্যাশসেট (অফ টি) শ্রেণিটি মান ছাড়া একটি অভিধান (অফ টিকি, টিভিয়াল) সংগ্রহ হিসাবে ভাবা যেতে পারে ।

একটি হ্যাশসেট (অফ অফ টি) সংগ্রহটি বাছাই করা হয় না এবং এতে নকল উপাদান থাকতে পারে না ...


8
দুর্ভাগ্যক্রমে, হ্যাশসেটগুলি সাম্প্রতিককালে যোগ করা হয়নি। আপনি যদি ফ্রেমওয়ার্কটির কোনও পুরানো সংস্করণে কাজ করছেন তবে আপনাকে আপনার মুগ্ধ করা অভিধান <> বা হ্যাশটেবলের সাথে আটকাতে হবে।
গ্রেগ ডি

411

আপনি .NET 3.5 ব্যবহার করছেন, আপনি ব্যবহার করতে পারেন HashSet<T>। এটি সত্য যে। নেট সেটের পাশাপাশি জাভা যদিও পূরণ করে না।

Wintellect PowerCollections খুব সাহায্য করতে পারে।


16
আমার সন্দেহ হয় যে সেট কয়েকটি ভাষায় একটি কীওয়ার্ড, যা সমস্যার কারণ হতে পারে।
জন স্কিটি

3
@ মনিশ: না তা নয়। সি # 3 অনুচ্ছেদের 2.4.3 বিভাগটি দেখুন। এটির কেবল বৈশিষ্ট্যের জন্য বিশেষ অর্থ রয়েছে।
জন স্কিটি

28
এটিকে কেবল সেট পরিবর্তে হ্যাশসেট বলার কারণ জাভা-তে "সেট" একটি ইন্টারফেসের বর্ণনা দেয়, যেখানে "হ্যাশসেট" একটি বাস্তবায়ন বর্ণনা করে - বিশেষত, এটি হ্যাশ মানচিত্রের সমর্থিত একটি সেট। এইভাবে, আমরা জানি (বা দৃ strongly়ভাবে প্রত্যাশা করা উচিত) sertোকানো এবং অ্যাক্সেসে ও (1) অ্যাক্সেসের সময় নেওয়া উচিত, বনাম "লিঙ্কডলিস্টসেট" যা ও (এন) সময় নেওয়ার জন্য সন্নিবেশ এবং অ্যাক্সেসের আশা করতে আমাদের নেতৃত্ব দেয়।
ডেভিড সাউদার

5
আপনার অর্থ কি "। নেট সেটের পাশাপাশি মেটে না জাভা যদিও?" এই সেটটি কি কোনওভাবে জাভার তুলনায় অপূর্ণ?
লুই রাইস

34
@ লুইস: আপনি কোন সেটের কথা বলছেন? জাভা বিভিন্ন পরিস্থিতিতে সেট বিভিন্ন প্রচুর বাস্তবায়ন আছে। .NET এর একটি। নেট 3.5 (হ্যাশসেট) এবং দুটি নেট নেট 4 (হ্যাশসেট এবং সোর্টার্ড) ছিল। আমাদের শুরু করার জন্য .NET 3.5 অবধি অপেক্ষা করতে হয়েছিল যে বিষয়টি বেশ অবাক করার মতো।
জন স্কিটি

26

যদি আপনি .NET 4.0 বা তার পরে ব্যবহার করছেন:

যে ক্ষেত্রে আপনার বাছাই করার দরকার পরে ব্যবহার করুন SortedSet<T>। অন্যথায় যদি আপনি না করেন, তবে HashSet<T>এটি O(1)অনুসন্ধান এবং পরিচালনা পরিচালনা করার জন্য এটি ব্যবহার করুন । যেখানে SortedSet<T>হয় O(log n)অনুসন্ধানের জন্য এবং অপারেশন নিপূণভাবে।



13

আমি একটি কাছাকাছি একটি মোড়ক ব্যবহার করি Dictionary<T, object>, মানগুলিতে নাল সঞ্চয় করি। এটি কীগুলিতে ও (1) যুক্ত, অনুসন্ধান এবং সরিয়ে দেয় এবং সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে একটি সেটের মতো কাজ করে।


2
আপনার অবশ্যই এটি অবশ্যই স্ট্যান্ড :: আনর্ডার্ড_সেটের সমান। std :: সেট অর্ডার করা হয়। উদাহরণস্বরূপ, আপনি দ্রুত সীমাটির শুরু এবং শেষ পয়েন্টটি সন্ধান করতে পারেন এবং কী-ক্রমে আইটেমগুলি পরিদর্শন করে শুরু থেকে শেষ পর্যন্ত পুনরাবৃত্তি করতে পারেন। SortedDictionary হয় মোটামুটিভাবে এসটিডি :: সেট সমতুল্য।
doug65536

11

কটাক্ষপাত আছে PowerCollections CodePlex এ করে। সেট এবং অর্ডারসেট ব্যতীত এটিতে আরও কয়েকটি দরকারী সংগ্রহের ধরণ রয়েছে যেমন ডেক, মাল্টি ডিকোরিয়াস, ব্যাগ, অর্ডারব্যাগ, অর্ডারড অভিধান এবং অর্ডারড মাল্ট্রি ডিকোশনারি।

আরও সংগ্রহের জন্য, রয়েছে সি 5 জেনেরিক সংগ্রহ গ্রন্থাগার


-5

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

public class UniqueList<T> : List<T>
{
    public new void Add(T obj)
    {
        if(!Contains(obj))
        {
            base.Add(obj);
        }
    }
}

যেহেতু তালিকা সম্পূর্ণরূপে সমতা নির্ধারণের জন্য সমান পদ্ধতিটি ব্যবহার করে, আপনি পছন্দসই ফলাফল পেয়েছেন তা নিশ্চিত করতে আপনি আপনার টি টাইপের সমান পদ্ধতিটি সংজ্ঞায়িত করতে পারেন।


13
আপনি এটি ব্যবহার করতে না চাওয়ার কারণ List.Containsহ'ল O(n)জটিলতা যার অর্থ আপনার Addপদ্ধতিটিও এখন O(n)জটিল হয়ে ওঠে । Addউভয় ক্ষেত্রেই অভ্যন্তরীণ সংগ্রহটি পুনরায় আকার দেওয়ার দরকার নেই Listএবং HashMapএটি O(1)জটিলতা হওয়া উচিত । টিএলডিআর: এটি কাজ করবে তবে এটি হ্যাকি এবং কম দক্ষ।
রিচার্ড মার্স্কেল - ড্র্যাকির

6
অবশ্যই, যদি আপনার অবজেক্টগুলি গেটহ্যাশকোডের জন্য উপযুক্ত মানটি না ফেরায়, আপনি এগুলিকে হ্যাশ-ভিত্তিক ধারক মধ্যে রাখবেন না। কম দক্ষ পাত্রে ব্যবহার করার চেয়ে গেটহ্যাশকোড ঠিক করা ভাল।
বিএমএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.