📄 readonlydictionarybase.cs
字号:
/// returned as a DictionaryEntry.
/// The entries are enumerated in the same orders as the (overridden) GetEnumerator
/// method.
/// </summary>
/// <returns>An enumerator for enumerating all the elements in the OrderedDictionary.</returns>
IEnumerator IEnumerable.GetEnumerator()
{
return ((IDictionary)this).GetEnumerator();
}
/// <summary>
/// Returns whether this dictionary is fixed size.
/// </summary>
/// <value>Always returns true.</value>
bool IDictionary.IsFixedSize
{
get { return true; }
}
/// <summary>
/// Returns if this dictionary is read-only.
/// </summary>
/// <value>Always returns true.</value>
bool IDictionary.IsReadOnly
{
get { return true; }
}
/// <summary>
/// Returns a collection of all the keys in the dictionary. The values in this collection will
/// be enumerated in the same order as the (overridden) GetEnumerator method.
/// </summary>
/// <value>The collection of keys.</value>
ICollection IDictionary.Keys
{
get { return new KeysCollection(this); }
}
/// <summary>
/// Returns a collection of all the values in the dictionary. The values in this collection will
/// be enumerated in the same order as the (overridden) GetEnumerator method.
/// </summary>
/// <value>The collection of values.</value>
ICollection IDictionary.Values
{
get { return new ValuesCollection(this); }
}
/// <summary>
/// Gets the value associated with a given key. When getting a value, if this
/// key is not found in the collection, then null is returned. If the key is not of the correct type
/// for this dictionary, null is returned.
/// </summary>
/// <value>The value associated with the key, or null if the key was not present.</value>
/// <exception cref="NotSupportedException">Always thrown from the set accessor, indicating
/// that the dictionary is read only.</exception>
object IDictionary.this[object key]
{
get
{
if (key is TKey || key == null) {
TKey theKey = (TKey)key;
TValue theValue;
// The IDictionary (non-generic) indexer returns null for not found, instead of
// throwing an exception like the generic IDictionary indexer.
if (TryGetValue(theKey, out theValue))
return theValue;
else
return null;
}
else {
return null;
}
}
set
{
MethodModifiesCollection();
}
}
#endregion
/// <summary>
/// Display the contents of the dictionary in the debugger. This is intentionally private, it is called
/// only from the debugger due to the presence of the DebuggerDisplay attribute. It is similar
/// format to ToString(), but is limited to 250-300 characters or so, so as not to overload the debugger.
/// </summary>
/// <returns>The string representation of the items in the collection, similar in format to ToString().</returns>
new internal string DebuggerDisplayString()
{
const int MAXLENGTH = 250;
bool firstItem = true;
System.Text.StringBuilder builder = new System.Text.StringBuilder();
builder.Append("{");
// Call ToString on each item and put it in.
foreach (KeyValuePair<TKey, TValue> pair in this) {
if (builder.Length >= MAXLENGTH) {
builder.Append(", ...");
break;
}
if (!firstItem)
builder.Append(", ");
if (pair.Key == null)
builder.Append("null");
else
builder.Append(pair.Key.ToString());
builder.Append("->");
if (pair.Value == null)
builder.Append("null");
else
builder.Append(pair.Value.ToString());
firstItem = false;
}
builder.Append("}");
return builder.ToString();
}
#region Keys and Values collections
/// <summary>
/// A private class that implements ICollection<TKey> and ICollection for the
/// Keys collection. The collection is read-only.
/// </summary>
[Serializable]
private sealed class KeysCollection : ReadOnlyCollectionBase<TKey>
{
private ReadOnlyDictionaryBase<TKey, TValue> myDictionary;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="myDictionary">The dictionary this is associated with.</param>
public KeysCollection(ReadOnlyDictionaryBase<TKey, TValue> myDictionary)
{
this.myDictionary = myDictionary;
}
public override int Count
{
get { return myDictionary.Count; }
}
public override IEnumerator<TKey> GetEnumerator()
{
foreach (KeyValuePair<TKey, TValue> pair in myDictionary)
yield return pair.Key;
}
public override bool Contains(TKey key)
{
return myDictionary.ContainsKey(key);
}
}
/// <summary>
/// A private class that implements ICollection<TKey> and ICollection for the
/// Values collection. The collection is read-only.
/// </summary>
[Serializable]
private sealed class ValuesCollection : ReadOnlyCollectionBase<TValue>
{
private ReadOnlyDictionaryBase<TKey, TValue> myDictionary;
public ValuesCollection(ReadOnlyDictionaryBase<TKey, TValue> myDictionary)
{
this.myDictionary = myDictionary;
}
public override int Count
{
get { return myDictionary.Count; }
}
public override IEnumerator<TValue> GetEnumerator()
{
foreach (KeyValuePair<TKey, TValue> pair in myDictionary)
yield return pair.Value;
}
}
#endregion
/// <summary>
/// A class that wraps a IDictionaryEnumerator around an IEnumerator that
/// enumerates KeyValuePairs. This is useful in implementing IDictionary, because
/// IEnumerator can be implemented with an iterator, but IDictionaryEnumerator cannot.
/// </summary>
[Serializable]
private class DictionaryEnumeratorWrapper : IDictionaryEnumerator
{
private IEnumerator<KeyValuePair<TKey, TValue>> enumerator;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="enumerator">The enumerator of KeyValuePairs that is being wrapped.</param>
public DictionaryEnumeratorWrapper(IEnumerator<KeyValuePair<TKey, TValue>> enumerator)
{
this.enumerator = enumerator;
}
public DictionaryEntry Entry
{
get
{
KeyValuePair<TKey, TValue> pair = enumerator.Current;
DictionaryEntry entry = new DictionaryEntry();
if (pair.Key != null)
entry.Key = pair.Key;
entry.Value = pair.Value;
return entry;
}
}
public object Key
{
get
{
KeyValuePair<TKey, TValue> pair = enumerator.Current;
return pair.Key;
}
}
public object Value
{
get
{
KeyValuePair<TKey, TValue> pair = enumerator.Current;
return pair.Value;
}
}
public void Reset()
{
throw new NotSupportedException(Strings.ResetNotSupported);
}
public bool MoveNext()
{
return enumerator.MoveNext();
}
public object Current
{
get
{
return Entry;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -