只将唯一项目添加到列表

我正在通过networking宣布自己的远程设备列表。 如果以前没有添加过,我只想将设备添加到列表中。

这些公告即将通过asynchronous套接字侦听器,因此添加设备的代码可以在多个线程上运行。 我不知道我在做什么错,但没有任何我尝试我最终重复。 这是我目前拥有的…..

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

如果你的要求是没有重复,你应该使用HashSet 。

当项目已经存在时, HashSet.Add将返回false (如果这对你来说甚至是重要的)。

您可以使用@pstrjds链接到下面(或这里 )的构造函数来定义相等运算符,或者您需要在RemoteDeviceGetHashCodeEquals )中实现相等方法。

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

就像接受的答案说HashSet没有订单。 如果订单很重要,您可以继续使用列表,并检查它是否包含该项目,然后再添加它。

 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; } }