কেবল তালিকায় অনন্য আইটেম যুক্ত করুন


85

তারা নেটওয়ার্ক জুড়ে নিজেকে ঘোষণা করার সাথে সাথে আমি তালিকায় দূরবর্তী ডিভাইসগুলি যুক্ত করছি। আমি কেবল তালিকায় ডিভাইসটি যুক্ত করতে চাই যদি এটি আগে যুক্ত না করা হয়।

ঘোষণাগুলি একটি অ্যাসিঙ্ক সকেট শ্রোতার জুড়ে আসছে যাতে কোনও ডিভাইস যুক্ত করার কোডটি একাধিক থ্রেডে চালানো যায়। আমি কী ভুল করছি তা নিশ্চিত নই তবে আমি যা চেষ্টা করি তার সদৃশ কোন নকলই আমি শেষ করতে পারি না। আমার কাছে বর্তমানে যা আছে তা এখানে .....

lock (_remoteDevicesLock)
{
    RemoteDevice rDevice = (from d in _remoteDevices
                            where d.UUID.Trim().Equals(notifyMessage.UUID.Trim(), StringComparison.OrdinalIgnoreCase)
                            select d).FirstOrDefault();
     if (rDevice != null)
     {
         //Update Device.....
     }
     else
     {
         //Create A New Remote Device
         rDevice = new RemoteDevice(notifyMessage.UUID);
         _remoteDevices.Add(rDevice);
     }
}

এর সংজ্ঞা কী RemoteDevice?
— পিএসটিজেড

ডিবাগিংয়ের উদ্দেশ্যে, আপনি কি _ টাইমস্ট্যাম্প ক্ষেত্রের সাহায্যে আপনার _ রেমোটে ডিভাইসেস ক্লাসটি বাড়িয়ে দিতে পারবেন, _ রেমোটে ডিভাইস.লাস্ট সাইন = এখন?
— বেথ

উত্তর:


155

যদি আপনার প্রয়োজনীয়তার কোনও সদৃশ না থাকে তবে আপনার একটি হ্যাশসেট ব্যবহার করা উচিত ।

HashSet.Add ফিরে আসবে মিথ্যা যখন আইটেম আগে থেকেই আছে (যদি যে এমনকি আপনি কাছে গুরুত্বপূর্ণ)।

আপনি যে কনস্ট্রাক্টরটি @pstrjds নীচে লিঙ্ক করেছেন (বা এখানে ) সাম্যতা অপারেটরটি সংজ্ঞায়িত করতে বা আপনাকে RemoteDevice( GetHashCode& Equals) এ সাম্যতা পদ্ধতিগুলি প্রয়োগ করতে হবে ।


4
এই উত্তর যোগ করতে চলেছিলাম। - তুমি তুলনা সংজ্ঞায়িত করতে এই জমিদার ব্যবহার করতে পারেন msdn.microsoft.com/en-us/library/bb359100(v=vs.100).aspx
— pstrjds

11
এখানে একটি গুরুত্বপূর্ণ নোট হ্যাশসেট সন্নিবেশ ক্রমের সম্মানের গ্যারান্টিযুক্ত নয়। সুতরাং যদি আদেশটি গুরুত্বপূর্ণ হয় (আইটেমগুলির তালিকায় একই ক্রমে উপস্থিত হওয়া দরকার যেমন আপনি যা করেন তার মতো List<T>) তবে হ্যাশসেটটি ভাল কাজ করে না।
— জুলিয়ানআর

এই জন্য অনেক ধন্যবাদ। আমার এখনও থ্রেড সুরক্ষার জন্য লকটি রাখা দরকার বা আরও ভাল কোনও উপায় আছে?
— অলি

4
@ অলি আপনাকে লকটি রাখা দরকার, তবে অপারেশনটি আরও দ্রুত হবে, সুতরাং তারা একে অপরের দিকে ততটা অপেক্ষা করবে না। ConcurrentSetদুর্ভাগ্যক্রমে কোনও শ্রেণি নেই । তবে এখানে একটি ConcurrentDictionaryশ্রেণি রয়েছে, তাই আপনি এটি ব্যবহার করতে পারেন, আপনার মানগুলি কী হিসাবে সংরক্ষণ nullকরতে এবং মানগুলিতে সঞ্চিত করতে পারেন।
— পরিবেশন করুন

4
@ অলি: আমি যদি আপনি হয়ে থাকি তবে আমি এই সমস্যাটি সমাধানের জন্য আরেকটি প্রশ্ন পোস্ট করতাম (গেটহ্যাশকোড এবং সমতুল্য উভয়ের পুরো উত্স সহ, যখন আপনি আশা করবেন না তখন সেগুলি মিলবে)।
— অস্টিন সালোনেন

23
//HashSet allows only the unique values to the list
HashSet<int> uniqueList = new HashSet<int>();

var a = uniqueList.Add(1);
var b = uniqueList.Add(2);
var c = uniqueList.Add(3);
var d = uniqueList.Add(2); // should not be added to the list but will not crash the app

//Dictionary allows only the unique Keys to the list, Values can be repeated
Dictionary<int, string> dict = new Dictionary<int, string>();

dict.Add(1,"Happy");
dict.Add(2, "Smile");
dict.Add(3, "Happy");
dict.Add(2, "Sad"); // should be failed // Run time error "An item with the same key has already been added." App will crash

//Dictionary allows only the unique Keys to the list, Values can be repeated
Dictionary<string, int> dictRev = new Dictionary<string, int>();

dictRev.Add("Happy", 1);
dictRev.Add("Smile", 2);
dictRev.Add("Happy", 3); // should be failed // Run time error "An item with the same key has already been added." App will crash
dictRev.Add("Sad", 2);

16

গৃহীত উত্তরের মতোই হ্যাশসেটের অর্ডার নেই। অর্ডারটি গুরুত্বপূর্ণ হলে আপনি একটি তালিকা ব্যবহার করতে চালিয়ে যেতে পারেন এবং এটি যুক্ত করার আগে এটিতে আইটেম রয়েছে কিনা তা পরীক্ষা করতে পারেন।

if (_remoteDevices.Contains(rDevice))
    _remoteDevices.Add(rDevice);

কাস্টম ক্লাস / অবজেক্টে তালিকা সম্পাদনা করা (কন্টেইনগুলি) কাস্টম ক্লাসে প্রয়োগ IEquatable<T>করা বা ওভাররাইডিংয়ের প্রয়োজন Equals। এটি ক্লাসেও প্রয়োগ করা ভাল ধারণা GetHashCode। এটি https://msdn.microsoft.com/en-us/library/ms224763.aspx এ ডকুমেন্টেশন অনুসারে

public class RemoteDevice: IEquatable<RemoteDevice>
{
    private readonly int id;
    public RemoteDevice(int uuid)
    {
        id = id
    }
    public int GetId
    {
        get { return id; }
    }

    // ...

    public bool Equals(RemoteDevice other)
    {
        if (this.GetId == other.GetId)
            return true;
        else
            return false;
    }
    public override int GetHashCode()
    {
        return id;
    }
}

হাই THX তবে আপনি যদি ওভাররাইড করতে না পারেন কারণ আমি অন্য কারও কোডের একটি রেফারেন্স ব্যবহার করছি - এখানে কেউ কী করবে?
— বিকেএসপুরজন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.