98

リモート デバイスがネットワーク上で自分自身をアナウンスするので、それらをリストに追加しています。以前に追加されていない場合にのみ、デバイスをリストに追加します。

アナウンスメントは非同期ソケット リスナーに渡されるため、デバイスを追加するコードを複数のスレッドで実行できます。何が間違っているのかわかりませんが、何を試しても重複してしまいます。これが私が現在持っているものです.....

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

3 に答える 3

169

要件が重複しないようにする場合は、HashSetを使用する必要があります。

HashSet.Addは、アイテムが既に存在する場合にfalseを返します(それが重要な場合)。

@pstrjds が以下 (またはここRemoteDevice) にリンクしているコンストラクターを使用して等値演算子を定義するか、 ( GetHashCode& )で等値メソッドを実装する必要がありますEquals

于 2012-11-21T16:55:05.233 に答える
26
//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);
于 2016-11-07T13:51:22.167 に答える