Ich füge Remote-Geräte zu einer Liste hinzu, während sie sich im Netzwerk anmelden. Ich möchte das Gerät nur dann zur Liste hinzufügen, wenn es noch nicht hinzugefügt wurde.
Die Ansagen stoßen auf einen asynchronen Socket-Listener, sodass der Code zum Hinzufügen eines Geräts auf mehreren Threads ausgeführt werden kann. Ich bin mir nicht sicher, was ich falsch mache, aber egal was ich versuche, ich bekomme Duplikate. Hier ist was ich derzeit habe .....
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
?Antworten:
Wenn Ihre Anforderungen keine Duplikate enthalten sollen, sollten Sie ein HashSet verwenden .
HashSet.Add gibt false zurück, wenn das Element bereits vorhanden ist (falls dies für Sie überhaupt von Bedeutung ist).
Sie können den Konstruktor verwenden, auf den @pstrjds unten (oder hier ) verweist , um den Gleichheitsoperator zu definieren, oder Sie müssen die Gleichheitsmethoden in
RemoteDevice
(GetHashCode
&Equals
) implementieren .quelle
List<T>
angezeigt werden, in der Sie sie eingegeben haben , wie z. B. was passiert ), funktioniert HashSet nicht gut.ConcurrentSet
leider keine Klasse. Es gibt jedoch eineConcurrentDictionary
Klasse, sodass Sie diese verwenden, Ihre Werte als Schlüssel speichern und einfachnull
in den Werten speichern können.//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);
quelle
Genau wie die akzeptierte Antwort besagt, dass ein HashSet keine Bestellung hat. Wenn die Reihenfolge wichtig ist, können Sie weiterhin eine Liste verwenden und prüfen, ob sie den Artikel enthält, bevor Sie ihn hinzufügen.
if (_remoteDevices.Contains(rDevice)) _remoteDevices.Add(rDevice);
Das Ausführen von List.Contains () für eine benutzerdefinierte Klasse / ein benutzerdefiniertes Objekt erfordert die Implementierung
IEquatable<T>
in der benutzerdefinierten Klasse oder das Überschreiben derEquals
. Es ist eine gute Idee, diese auchGetHashCode
in der Klasse zu implementieren . Dies ist in der Dokumentation unter https://msdn.microsoft.com/en-us/library/ms224763.aspx enthaltenpublic 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; } }
quelle