📄 multidictionarybase.cs
字号:
int count = 0;
IEnumerator<TValue> enumValues;
if (TryEnumerateValuesForKey(key, out enumValues)) {
using (enumValues) {
while (enumValues.MoveNext())
count += 1;
}
}
return count;
}
/// <summary>
/// Gets a total count of values in the collection. This default implementation
/// is slow; it enumerates all of the keys in the dictionary and calls CountValues on each.
/// A derived class may be able to supply a more efficient implementation.
/// </summary>
/// <returns>The total number of values associated with all keys in the dictionary.</returns>
protected virtual int CountAllValues()
{
int count = 0;
using (IEnumerator<TKey> enumKeys = EnumerateKeys()) {
while (enumKeys.MoveNext()) {
TKey key = enumKeys.Current;
count += CountValues(key);
}
}
return count;
}
/// <summary>
/// Gets a read-only collection all the keys in this dictionary.
/// </summary>
/// <value>An readonly ICollection<TKey> of all the keys in this dictionary.</value>
public virtual ICollection<TKey> Keys
{
get { return new KeysCollection(this); }
}
/// <summary>
/// Gets a read-only collection of all the values in the dictionary.
/// </summary>
/// <returns>A read-only ICollection<TValue> of all the values in the dictionary.</returns>
public virtual ICollection<TValue> Values
{
get { return new ValuesCollection(this); }
}
/// <summary>
/// Gets a read-only collection of all the value collections in the dictionary.
/// </summary>
/// <returns>A read-only ICollection<IEnumerable<TValue>> of all the values in the dictionary.</returns>
ICollection<ICollection<TValue>> IDictionary<TKey, ICollection<TValue>>.Values
{
get { return new EnumerableValuesCollection(this); }
}
/// <summary>
/// Gets a read-only collection of all key-value pairs in the dictionary. If a key has multiple
/// values associated with it, then a key-value pair is present for each value associated
/// with the key.
/// </summary>
public virtual ICollection<KeyValuePair<TKey, TValue>> KeyValuePairs
{
get { return new KeyValuePairsCollection(this); }
}
/// <summary>
/// Returns a collection of all of the values in the dictionary associated with <paramref name="key"/>,
/// or changes the set of values associated with <paramref name="key"/>.
/// If the key is not present in the dictionary, an ICollection enumerating no
/// values is returned. The returned collection of values is read-write, and can be used to
/// modify the collection of values associated with the key.
/// </summary>
/// <param name="key">The key to get the values associated with.</param>
/// <value>An ICollection<TValue> with all the values associated with <paramref name="key"/>.</value>
public virtual ICollection<TValue> this[TKey key]
{
get
{
return new ValuesForKeyCollection(this, key);
}
set
{
ReplaceMany(key, value);
}
}
/// <summary>
/// Gets a collection of all the values in the dictionary associated with <paramref name="key"/>,
/// or changes the set of values associated with <paramref name="key"/>.
/// If the key is not present in the dictionary, a KeyNotFound exception is thrown.
/// </summary>
/// <param name="key">The key to get the values associated with.</param>
/// <value>An IEnumerable<TValue> that enumerates all the values associated with <paramref name="key"/>.</value>
/// <exception cref="KeyNotFoundException">The given key is not present in the dictionary.</exception>
ICollection<TValue> IDictionary<TKey, ICollection<TValue>>.this[TKey key]
{
get
{
if (ContainsKey(key))
return new ValuesForKeyCollection(this, key);
else
throw new KeyNotFoundException(Strings.KeyNotFound);
}
set
{
ReplaceMany(key, value);
}
}
/// <summary>
/// Replaces all values associated with <paramref name="key"/> with the single value <paramref name="value"/>.
/// </summary>
/// <remarks>This implementation simply calls Remove, followed by Add.</remarks>
/// <param name="key">The key to associate with.</param>
/// <param name="value">The new values to be associated with <paramref name="key"/>.</param>
/// <returns>Returns true if some values were removed. Returns false if <paramref name="key"/> was not
/// present in the dictionary before Replace was called.</returns>
public virtual bool Replace(TKey key, TValue value)
{
bool removed = Remove(key);
Add(key, value);
return removed;
}
/// <summary>
/// Replaces all values associated with <paramref name="key"/> with a new collection
/// of values. If the collection does not permit duplicate values, and <paramref name="values"/> has duplicate
/// items, then only the last of duplicates is added.
/// </summary>
/// <param name="key">The key to associate with.</param>
/// <param name="values">The new values to be associated with <paramref name="key"/>.</param>
/// <returns>Returns true if some values were removed. Returns false if <paramref name="key"/> was not
/// present in the dictionary before Replace was called.</returns>
public bool ReplaceMany(TKey key, IEnumerable<TValue> values)
{
bool removed = Remove(key);
AddMany(key, values);
return removed;
}
/// <summary>
/// Shows the string representation of the dictionary. The string representation contains
/// a list of the mappings in the dictionary.
/// </summary>
/// <returns>The string representation of the dictionary.</returns>
public override string ToString()
{
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, ICollection<TValue>> pair in this) {
if (!firstItem)
builder.Append(", ");
if (pair.Key == null)
builder.Append("null");
else
builder.Append(pair.Key.ToString());
builder.Append("->");
// Put all values in a parenthesized list.
builder.Append('(');
bool firstValue = true;
foreach (TValue val in pair.Value) {
if (!firstValue)
builder.Append(",");
if (val == null)
builder.Append("null");
else
builder.Append(val.ToString());
firstValue = false;
}
builder.Append(')');
firstItem = false;
}
builder.Append("}");
return builder.ToString();
}
/// <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, ICollection<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("->");
// Put all values in a parenthesized list.
builder.Append('(');
bool firstValue = true;
foreach (TValue val in pair.Value) {
if (!firstValue)
builder.Append(",");
if (val == null)
builder.Append("null");
else
builder.Append(val.ToString());
firstValue = false;
}
builder.Append(')');
firstItem = false;
}
builder.Append("}");
return builder.ToString();
}
/// <summary>
/// Enumerate all the keys in the dictionary, and for each key, the collection of values for that key.
/// </summary>
/// <returns>An enumerator to enumerate all the key, ICollection<value> pairs in the dictionary.</returns>
public override IEnumerator<KeyValuePair<TKey, ICollection<TValue>>> GetEnumerator()
{
using (IEnumerator<TKey> enumKeys = EnumerateKeys()) {
while (enumKeys.MoveNext()) {
TKey key = enumKeys.Current;
yield return new KeyValuePair<TKey, ICollection<TValue>>(key, new ValuesForKeyCollection(this, key));
}
}
}
#region Keys and Values collections
/// <summary>
/// A private class that provides the ICollection<TValue> for a particular key. This is the collection
/// that is returned from the indexer. The collections is read-write, live, and can be used to add, remove,
/// etc. values from the multi-dictionary.
/// </summary>
[Serializable]
private sealed class ValuesForKeyCollection : CollectionBase<TValue>
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -