如何在 C# 中将键值添加到字典时发生 notify\raise 事件
How to notify\raise event when a key value is added to Dictionary in C#
如果将新的 key\value 对添加到静态字典,我想在另一个线程中执行一些操作。一种天真的方法是频繁地进行轮询并检查是否包含 ContainsKey(givenKey),但我想做得更快而不是延迟轮询。
您必须创建自己的词典。最佳做法是:
public enum Type
{
AddItem,
RemoveItem
}
public class DictChangedEventArgs<K, V> : EventArgs
{
public Type Type
{
get;
set;
}
public K Key
{
get;
set;
}
public V Value
{
get;
set;
}
}
public class OwnDict<K, V> : IDictionary<K, V>
{
public delegate void DictionaryChanged(object sender, DictChangedEventArgs<K, V> e);
public event DictionaryChanged OnDictionaryChanged;
private IDictionary<K, V> innerDict;
public OwnDict()
{
innerDict = new Dictionary<K, V>();
}
public void Add(K key, V value)
{
if (OnDictionaryChanged != null)
{
OnDictionaryChanged(this, new DictChangedEventArgs<K, V>() { Type = Type.AddItem, Key = key, Value = value });
}
innerDict.Add(key, value);
}
// ...
// ...
}
现在您可以自由地为 Before-Add-Item
、After-Add-Item
创建活动了。您还可以将一些 Handled
参数添加到 DictChangedEventArgs
-Class 以防止添加特殊项目。您还可以决定使用 Type
-Enum 或为每个操作创建一个自己的事件。
但是可以肯定的是,您必须实现 IDictionary
中的所有方法,但这应该很容易。
如果将新的 key\value 对添加到静态字典,我想在另一个线程中执行一些操作。一种天真的方法是频繁地进行轮询并检查是否包含 ContainsKey(givenKey),但我想做得更快而不是延迟轮询。
您必须创建自己的词典。最佳做法是:
public enum Type
{
AddItem,
RemoveItem
}
public class DictChangedEventArgs<K, V> : EventArgs
{
public Type Type
{
get;
set;
}
public K Key
{
get;
set;
}
public V Value
{
get;
set;
}
}
public class OwnDict<K, V> : IDictionary<K, V>
{
public delegate void DictionaryChanged(object sender, DictChangedEventArgs<K, V> e);
public event DictionaryChanged OnDictionaryChanged;
private IDictionary<K, V> innerDict;
public OwnDict()
{
innerDict = new Dictionary<K, V>();
}
public void Add(K key, V value)
{
if (OnDictionaryChanged != null)
{
OnDictionaryChanged(this, new DictChangedEventArgs<K, V>() { Type = Type.AddItem, Key = key, Value = value });
}
innerDict.Add(key, value);
}
// ...
// ...
}
现在您可以自由地为 Before-Add-Item
、After-Add-Item
创建活动了。您还可以将一些 Handled
参数添加到 DictChangedEventArgs
-Class 以防止添加特殊项目。您还可以决定使用 Type
-Enum 或为每个操作创建一个自己的事件。
但是可以肯定的是,您必须实现 IDictionary
中的所有方法,但这应该很容易。