मैं एक STL के नक्शे के समान व्यवहार के साथ एक IDEDIA बनाने के लिए एनकैप्सुलेशन का उपयोग करता था , आप में से उन लोगों के लिए जो c ++ से परिचित हैं। जो नहीं कर रहे हैं के लिए:
- यदि कोई कुंजी मौजूद नहीं है, तो इंडेक्सर सुरक्षित स्थान पर {} नीचे डिफ़ॉल्ट मान लौटाता है, और डिफ़ॉल्ट मान के साथ शब्दकोश में उस कुंजी को जोड़ता है। यह अक्सर वांछित व्यवहार होता है, जैसा कि आप उन वस्तुओं को देख रहे हैं जो अंततः दिखाई देंगे या दिखाई देने का एक अच्छा मौका होगा।
- विधि Add (TK key, TV val) एक AddOrUpdate विधि के रूप में व्यवहार करता है, जो मान को वर्तमान में रखता है यदि वह फेंकने के बजाय मौजूद है। मैं यह नहीं देखता कि $ $ में AddOrUpdate पद्धति क्यों नहीं है और सोचता है कि बहुत ही सामान्य परिदृश्यों में त्रुटियों को फेंकना एक अच्छा विचार है।
टीएल / डीआर - सुरक्षित नाम को किसी भी परिस्थिति में अपवादों को फेंकने के लिए नहीं लिखा जाता है, अन्य विकृत परिदृश्यों के अलावा , जैसे कि कंप्यूटर मेमोरी से बाहर (या आग पर)। यह AddOrUpdate व्यवहार के साथ Add की जगह और Indexer से NotFoundException को फेंकने के बजाय डिफ़ॉल्ट रूप से वापस आता है।
यहाँ कोड है:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class SafeDictionary<TK, TD>: IDictionary<TK, TD> {
Dictionary<TK, TD> _underlying = new Dictionary<TK, TD>();
public ICollection<TK> Keys => _underlying.Keys;
public ICollection<TD> Values => _underlying.Values;
public int Count => _underlying.Count;
public bool IsReadOnly => false;
public TD this[TK index] {
get {
TD data;
if (_underlying.TryGetValue(index, out data)) {
return data;
}
_underlying[index] = default(TD);
return default(TD);
}
set {
_underlying[index] = value;
}
}
public void CopyTo(KeyValuePair<TK, TD>[] array, int arrayIndex) {
Array.Copy(_underlying.ToArray(), 0, array, arrayIndex,
Math.Min(array.Length - arrayIndex, _underlying.Count));
}
public void Add(TK key, TD value) {
_underlying[key] = value;
}
public void Add(KeyValuePair<TK, TD> item) {
_underlying[item.Key] = item.Value;
}
public void Clear() {
_underlying.Clear();
}
public bool Contains(KeyValuePair<TK, TD> item) {
return _underlying.Contains(item);
}
public bool ContainsKey(TK key) {
return _underlying.ContainsKey(key);
}
public IEnumerator<KeyValuePair<TK, TD>> GetEnumerator() {
return _underlying.GetEnumerator();
}
public bool Remove(TK key) {
return _underlying.Remove(key);
}
public bool Remove(KeyValuePair<TK, TD> item) {
return _underlying.Remove(item.Key);
}
public bool TryGetValue(TK key, out TD value) {
return _underlying.TryGetValue(key, out value);
}
IEnumerator IEnumerable.GetEnumerator() {
return _underlying.GetEnumerator();
}
}