2012-11-21 9 views
44

सूची में केवल अद्वितीय आइटम जोड़ें, मैं सूची में दूरस्थ डिवाइस जोड़ रहा हूं क्योंकि वे स्वयं नेटवर्क पर घोषणा करते हैं। मैं केवल सूची में डिवाइस को जोड़ना चाहता हूं अगर इसे पहले जोड़ा नहीं गया है।सूची

घोषणाएं एसिंक सॉकेट श्रोता में आ रही हैं, इसलिए डिवाइस को जोड़ने के लिए कोड कई धागे पर चलाया जा सकता है। मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं लेकिन मैं जो भी कोशिश करता हूं, वह मैं नकल के साथ समाप्त नहीं करता हूं। यहाँ मैं वर्तमान में क्या है .....

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); 
    } 
} 
+0

'RemoteDevice' के लिए परिभाषा क्या है पर दस्तावेज़ प्रति है? – pstrjds

+0

डीबगिंग उद्देश्यों के लिए, क्या आप अपने _remoteDevices क्लास को टाइमस्टैम्प फ़ील्ड के साथ बढ़ा सकते हैं, _remoteDevices.lastSeen = अब? – Beth

उत्तर

92

अपनी आवश्यकताओं को कोई डुप्लिकेट हैं, कर रहे हैं, तो आप एक HashSet का उपयोग करना चाहिए।

HashSet.Addझूठी वापस आ जाएगा जब आइटम पहले से मौजूद है (यदि यह आपके लिए भी महत्वपूर्ण है)।

आप निर्माता है कि नीचे (या here) के लिंक @pstrjds का उपयोग समानता ऑपरेटर परिभाषित करने के लिए कर सकते हैं या आप RemoteDevice (GetHashCode & Equals) में समानता के तरीकों को लागू करने की आवश्यकता होगी।

+3

इस उत्तर को जोड़ने के बारे में था। आप तुलना को परिभाषित करने के लिए इस अधिभार का उपयोग कर सकते हैं - http://msdn.microsoft.com/en-us/library/bb359100(v=vs.100).aspx – pstrjds

+4

यहां एक महत्वपूर्ण नोट यह है कि हैशसेट को सम्मिलन का सम्मान करने की गारंटी नहीं है आदेश। इसलिए यदि आदेश महत्वपूर्ण है (सूची में सूची में उसी क्रम में दिखाई देने की आवश्यकता है जैसे आप उन्हें डालते हैं, जैसे 'सूची ' के साथ क्या होता है) तो हैशसेट अच्छी तरह से काम नहीं करता है। – JulianR

+0

इसके लिए बहुत धन्यवाद। क्या मुझे अभी भी थ्रेड सुरक्षा के लिए लॉक रखने की आवश्यकता है या क्या कोई बेहतर तरीका है? – Oli

5

स्वीकार्य उत्तर की तरह ही हैशसेट के पास ऑर्डर नहीं है। यदि आदेश महत्वपूर्ण है तो आप एक सूची का उपयोग जारी रख सकते हैं और जांच सकते हैं कि इसमें आइटम जोड़ने से पहले इसमें आइटम शामिल है या नहीं।

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

प्रदर्शन List.Contains() एक कस्टम वर्ग/वस्तु पर कस्टम वर्ग पर 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; 
    } 
} 
+0

हाय thx लेकिन अगर आप ओवरराइड नहीं कर सकते हैं क्योंकि मैं किसी और के कोड के संदर्भ का उपयोग कर रहा हूं - कोई यहां क्या करता है? – BKSpurgeon

8
//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);