.NET- এ কেবল অনন্য আইটেমগুলিকে অনুমতি দেয় এমন সংগ্রহ?


103

সি # তে এমন কোনও সংগ্রহ রয়েছে যা আপনাকে এতে নকল আইটেম যুক্ত করতে দেবে না? উদাহরণস্বরূপ, এর নির্বোধ ক্লাস সহ

public class Customer {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }

    public override int GetHashCode() {
        return (FirstName + LastName + Address).GetHashCode();
    }

    public override bool Equals(object obj) {
        Customer C = obj as Customer;
        return C != null && String.Equals(this.FirstName, C.FirstName) && String.Equals(this.LastName, C.LastName) && String.Equals(this.Address, C.Address);
    }
}

নিম্নলিখিত কোডটি (স্পষ্টতই) একটি ব্যতিক্রম ছুঁড়ে ফেলবে:

Customer Adam = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Customer AdamDup = new Customer { Address = "A", FirstName = "Adam", LastName = "" };

Dictionary<Customer, bool> CustomerHash = new Dictionary<Customer, bool>();
CustomerHash.Add(Adam, true);
CustomerHash.Add(AdamDup, true);

তবে কি এমন কোনও শ্রেণি রয়েছে যা একইভাবে স্বতন্ত্রতার গ্যারান্টি দিবে, তবে কীভ্যালিউপায়ারগুলি ছাড়াই? আমি ভেবেছিলাম এটি HashSet<T>করবে, তবে ডকগুলি পড়ে মনে হচ্ছে শ্রেণিটি কেবল একটি সেট বাস্তবায়ন ( চিত্র দেখুন )।


4
আমি আপনার সমস্যা বুঝতে পারি না HashSet<T>। এমএসডিএন বলছে "হ্যাশসেট <টি> শ্রেণি উচ্চ-সম্পাদন সেট ক্রিয়াকলাপ সরবরাহ করে A
ড্যানিয়েল হিলগারথ

5
HashSet<T>অপর্যাপ্ত কেন আপনি আরও ব্যাখ্যা করতে পারেন ?
জেয়ার্ডপাড়

@mootinator: Dictionary<K,V>বর্গ নয় অর্ডার যে কোন ধরণের গ্যারান্টি।
লুক এইচ

3
আমার ধারণা, আপনি যখন কোনও বিদ্যমান মান যুক্ত করার চেষ্টা করবেন তখন তিনি কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলতে চান ... এটি করার জন্য, কেবল HashSet<T>.Addপদ্ধতি থেকে ফিরে আসা মূল্য মূল্য পরীক্ষা করুন এবং কখন নিক্ষেপ করুন false...
ডিগএমএল

2
কেবলমাত্র অপরিবর্তনীয় প্রকারের জন্য ওভারলোড করার জন্য এটি দৃ strongly়ভাবে সুপারিশ করে । একটি পরিবর্তনীয় গ্রাহক সাধারণত ডিফল্ট রেফারেন্স-সাম্যতার সাথে আরও ভাল হন।
হেন্ক হলটারম্যান

উত্তর:


205

HashSet<T>আপনি যা খুঁজছেন এমএসডিএন থেকে (জোর দেওয়া)

HashSet<T>বর্গ উচ্চ ক্ষমতা সম্পন্ন সেট অপারেশন প্রদান করে। একটি সেট একটি সংগ্রহ যা কোনও সদৃশ উপাদান নেই এবং যার উপাদানগুলি কোনও নির্দিষ্ট ক্রমে নেই।

নোট করুন যে HashSet<T>.Add(T item)পদ্ধতিটি একটি প্রদান করে bool- trueযদি আইটেমটি সংগ্রহের সাথে যুক্ত করা হয়; falseযদি আইটেমটি ইতিমধ্যে উপস্থিত ছিল।


9
এই ক্ষেত্রে টি আইটেমের আইকুয়েটেবল ইন্টারফেস প্রয়োগ করা উচিত। শ্রেণি যদি এই ইন্টারফেসটির উত্তরাধিকারী না হয় তবে হ্যাশসেট <টি> সদৃশ উপাদান যুক্ত করে।
রুডল্ফ ডিভোরেসেক

অথবা আইটেমটি বাস্তবায়ন করার পরিবর্তে IEquatable, আপনি EqualityComparer<T>উদাহরণের (কাস্টম) প্রয়োগকারীর কাছে পাস করতে পারেন HashSet<T>
সিপকে শুরস্ট্রা

17

হ্যাশসেটে কেবলমাত্র একটি এক্সটেনশন পদ্ধতি কীভাবে?

public static void AddOrThrow<T>(this HashSet<T> hash, T item)
{
    if (!hash.Add(item))
        throw new ValueExistingException();
}

13

HashSet<T>এমএসডিএন এর পৃষ্ঠা থেকে :

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

(জোর আমার)


4

আপনার যা যা প্রয়োজন তা হ'ল উপাদানগুলির স্বাতন্ত্র্যতা নিশ্চিত করা, তবে হ্যাশসেট আপনার যা প্রয়োজন।

আপনি যখন "কেবলমাত্র একটি সেট বাস্তবায়ন" বলছেন তখন আপনার অর্থ কী? একটি সেট হ'ল (সংজ্ঞা অনুসারে) অনন্য উপাদানগুলির একটি সংগ্রহ যা উপাদান ক্রম সংরক্ষণ করে না।


আপনি পুরোপুরি ঠিক আছেন; প্রশ্নটি ছিল একধরণের বোকা। মূলত, আমি এমন কোনও সন্ধান করছিলাম যা একটি নকল যুক্ত হওয়ার সাথে সাথে একটি ব্যতিক্রম ছুঁড়ে ফেলবে (ডিকশনারি <টিকি, টিভিয়াল্য> এর মতো), তবে ইতিমধ্যে উল্লিখিত হিসাবে, হ্যাশসেট <টি> সদৃশ অ্যাডে মিথ্যা প্রত্যাবর্তন করবে। +1, আপনাকে ধন্যবাদ।
অ্যাডাম রাকিস


3

শুধু আমার 2 সেন্ট যোগ করতে ...

আপনার যদি মান মূল্যায়ন ধারণা-নিক্ষেপের প্রয়োজন হয় তবে আপনি HashSet<T>সহজেই আপনার সংগ্রহটি তৈরি করতে পারেন:

public class ThrowingHashSet<T> : ICollection<T>
{
    private HashSet<T> innerHash = new HashSet<T>();

    public void Add(T item)
    {
        if (!innerHash.Add(item))
            throw new ValueExistingException();
    }

    public void Clear()
    {
        innerHash.Clear();
    }

    public bool Contains(T item)
    {
        return innerHash.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        innerHash.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return innerHash.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(T item)
    {
        return innerHash.Remove(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return innerHash.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

উদাহরণস্বরূপ, আপনার যদি এটি অনেক জায়গায় প্রয়োজন হয় তবে এটি দরকারী হতে পারে ...


অবশ্যই। কিছুটা অন্তর্নির্মিত কিনা তা আমি ভাবছিলাম, তবে আপনাকে +1 ধন্যবাদ
অ্যাডাম র্যাকিস

0

আপনি নীচের মত কিছু ধরণের অনন্য তালিকা দেখতে পারেন

public class UniqueList<T>
{
    public List<T> List
    {
        get;
        private set;
    }
    List<T> _internalList;

    public static UniqueList<T> NewList
    {
        get
        {
            return new UniqueList<T>();
        }
    }

    private UniqueList()
    {            
        _internalList = new List<T>();
        List = new List<T>();
    }

    public void Add(T value)
    {
        List.Clear();
        _internalList.Add(value);
        List.AddRange(_internalList.Distinct());
        //return List;
    }

    public void Add(params T[] values)
    {
        List.Clear();
        _internalList.AddRange(values);
        List.AddRange(_internalList.Distinct());
       // return List;
    }

    public bool Has(T value)
    {
        return List.Contains(value);
    }
}

এবং আপনি এটি নীচের মত ব্যবহার করতে পারেন

var uniquelist = UniqueList<string>.NewList;
uniquelist.Add("abc","def","ghi","jkl","mno");
uniquelist.Add("abc","jkl");
var _myList = uniquelist.List;

"abc","def","ghi","jkl","mno"ডুপ্লিকেট যুক্ত করা হলেও কেবল সর্বদা ফিরে আসবে

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