
public class DictionaryEx<TKey, TValue> : IDictionary<TKey, TValue> { /// <summary> 用戶存儲數據的字典 /// </summary> PRivate IDictionary<TKey, TValue> _items; /// <summary> 默認值 /// </summary> private TValue _defaultValue; /// <summary> 用于獲取值的委托 /// </summary> private Converter<TKey, TValue> _getValue; /// <summary> 1返回_defaultValue, 2執行_getValue, 0拋出異常 /// </summary> private int _mode = 0; #region 構造函數 /// <summary> 初始化 DictionaryEx , key不存在時返回defaultValue /// </summary> /// <param name="defaultValue">默認值</param> public DictionaryEx(TValue defaultValue) { _items = new Dictionary<TKey, TValue>(); _defaultValue = defaultValue; _mode = 1; } /// <summary> 初始化 DictionaryEx , key不存在時返回defaultValue /// </summary> /// <param name="defaultValue">默認值</param> /// <param name="comparer">比較鍵時要使用對象,如果為null則使用默認比較方法</param> public DictionaryEx(TValue defaultValue, IEqualityComparer<TKey> comparer) { _items = new Dictionary<TKey, TValue>(comparer); _defaultValue = defaultValue; _mode = 1; } /// <summary> 初始化 DictionaryEx 只讀集合, key不存在時返回defaultValue /// </summary> /// <param name="defaultValue">默認值</param> /// <param name="dictionary">內部字典</param> public DictionaryEx(TValue defaultValue, IDictionary<TKey, TValue> dictionary) { Assertor.AreNull(dictionary, "dictionary"); _items = dictionary; IsReadOnly = true; _defaultValue = defaultValue; _mode = 1; } /// <summary> 初始化 DictionaryEx, key不存在時返回defaultValue /// </summary> /// <param name="defaultValue">默認值</param> /// <param name="dictionary">內部字典</param> /// <param name="isReadOnly">是否只讀</param> public DictionaryEx(TValue defaultValue, IDictionary<TKey, TValue> dictionary, bool isReadOnly) { Assertor.AreNull(dictionary, "dictionary"); _items = dictionary; IsReadOnly = isReadOnly; _defaultValue = defaultValue; _mode = 1; } /// <summary> 初始化 DictionaryEx 設定getValue委托,key不存在時執行委托,并加入集合 /// </summary> /// <param name="getValue">獲取值的委托</param> public DictionaryEx(Converter<TKey, TValue> getValue) { Assertor.AreNull(getValue, "getValue"); _items = new Dictionary<TKey, TValue>(); _getValue = getValue; _mode = 2; } /// <summary> 初始化 DictionaryEx 設定getValue委托,key不存在時執行委托,并加入集合 /// </summary> /// <param name="getValue">獲取值的委托</param> /// <param name="comparer">比較鍵時要使用對象,如果為null則使用默認比較方法</param> public DictionaryEx(Converter<TKey, TValue> getValue, IEqualityComparer<TKey> comparer) { Assertor.AreNull(getValue, "getValue"); _items = new Dictionary<TKey, TValue>(comparer); _getValue = getValue; _mode = 2; } /// <summary> 初始化 DictionaryEx 設定getValue委托,key不存在時執行委托,并加入集合 /// </summary> /// <param name="getValue">獲取值的委托</param> /// <param name="isReadOnly">集合是否限制外部修改</param> public DictionaryEx(Converter<TKey, TValue> getValue, bool isReadOnly) { Assertor.AreNull(getValue, "getValue"); _items = new Dictionary<TKey, TValue>(); _getValue = getValue; IsReadOnly = isReadOnly; _mode = 2; } /// <summary> 初始化 DictionaryEx 設定getValue委托,key不存在時執行委托,并加入集合 /// </summary> /// <param name="getValue">獲取值的委托</param> /// <param name="comparer">比較鍵時要使用對象</param> /// <param name="isReadOnly">集合是否限制外部修改</param> public DictionaryEx(Converter<TKey, TValue> getValue, IEqualityComparer<TKey> comparer, bool isReadOnly) { Assertor.AreNull(getValue, "getValue"); _items = new Dictionary<TKey, TValue>(comparer); _getValue = getValue; IsReadOnly = isReadOnly; _mode = 2; } /// <summary> 初始化 DictionaryEx 設定getValue委托,key不存在時執行委托,并加入集合 /// </summary> /// <param name="getValue">獲取值的委托</param> /// <param name="dictionary">內部字典</param> public DictionaryEx(Converter<TKey, TValue> getValue, IDictionary<TKey, TValue> dictionary) { Assertor.AreNull(getValue, "getValue"); Assertor.AreNull(dictionary, "dictionary"); _items = dictionary; _getValue = getValue; IsReadOnly = true; _mode = 2; } /// <summary> 初始化 DictionaryEx 設定getValue委托,key不存在時執行委托,并加入集合 /// </summary> /// <param name="getValue">獲取值的委托</param> /// <param name="dictionary">內部字典</param> /// <param name="isReadOnly">是否只讀</param> public DictionaryEx(Converter<TKey, TValue> getValue, IDictionary<TKey, TValue> dictionary, bool isReadOnly) { _items = dictionary; _getValue = getValue; IsReadOnly = isReadOnly; _mode = 2; } /// <summary> 初始化 DictionaryEx 只讀集合 /// </summary> /// <param name="dictionary">內部字典</param> public DictionaryEx(IDictionary<TKey, TValue> dictionary) { Assertor.AreNull(dictionary, "dictionary"); IsReadOnly = true; _items = dictionary; _mode = 0; } #endregion private TValue ReturnValue(TKey key) { switch (_mode) { case 1: return _defaultValue; case 2: var value = _getValue(key); lock (this) { _items[key] = value; } return value; default: throw new KeyNotFoundException(); } } public void Add(TKey key, TValue value) { this[key] = value; } public bool ContainsKey(TKey key) { return _items.ContainsKey(key); } public ICollection<TKey> Keys { get { return _items.Keys; } } public bool Remove(TKey key) { Assertor.AreTrue(IsReadOnly, "集合為只讀"); return _items.Remove(key); } public bool TryGetValue(TKey key, out TValue value) { return TryGetValue(key, out value); } public ICollection<TValue> Values { get { return _items.Values; } } public TValue this[TKey key] { get { TValue value; if (_items.TryGetValue(key, out value)) { return value; } return ReturnValue(key); } set { Assertor.AreTrue(IsReadOnly, "集合為只讀"); _items[key] = value; } } public void Add(KeyValuePair<TKey, TValue> item) { this[item.Key] = item.Value; } public void Clear() { Assertor.AreTrue(IsReadOnly, "集合為只讀"); _items.Clear(); } public bool Contains(KeyValuePair<TKey, TValue> item) { return _items.Contains(item); } public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) { ((IDictionary<TKey, TValue>)_items).CopyTo(array, arrayIndex); } public int Count { get { return _items.Count; } } public bool IsReadOnly { get; private set; } public bool Remove(KeyValuePair<TKey, TValue> item) { return Remove(item.Key); } public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() { return _items.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _items.GetEnumerator(); } }
static void Main(string[] args) { //key不存在返回默認值 ,key不區分大小寫 (構造函數重載可以設定內部集合,是否只讀) var dict = new DictionaryEx<string, string>("default", StringComparer.OrdinalIgnoreCase); dict.Add("AAA", "aaa"); Console.WriteLine(dict["aAa"]); //aaa Console.WriteLine(dict["Bbb"]); //default //key不存在,執行委托,返回value,并加入集合 , 集合本身為只讀 (構造函數重載可以設定內部集合,key比較方式) dict = new DictionaryEx<string, string>(key => "[" + key + "]", true); Console.WriteLine(dict["Bbb"]); //[Bbb] try { dict["Bbb"] = "newvalue"; //throw new NotSupportedException("集合為只讀"); } catch (Exception) { } //創建只讀鍵值對集合 var innerDict = new Dictionary<string, string>(); dict = new DictionaryEx<string, string>(innerDict); innerDict.Add("aaa", "aaa"); Console.WriteLine(dict["aaa"]); try { dict["Bbb"] = "newvalue"; //throw new NotSupportedException("集合為只讀"); } catch (Exception) { } try { Console.WriteLine(dict["bbb"]); //throw new KeyNotFoundException(); } catch (Exception) { } }
https://code.csdn.net/snippets/389634
|
新聞熱點
疑難解答