wp7 BaseDictionary<TKey, TValue>
/// Represents a dictionary mapping keys to values.
/// </summary>
///
/// <remarks>
/// Provides the plumbing for the portions of IDictionary<TKey,
/// TValue> which can reasonably be implemented without any
/// dependency on the underlying representation of the dictionary.
/// </remarks>
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(PREFIX + "DictionaryDebugView`2" + SUFFIX)]
public abstract class BaseDictionary<TKey, TValue> : IDictionary<TKey, TValue> {
private const string PREFIX = "System.Collections.Generic.Mscorlib_";
private const string SUFFIX =",mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089";
private KeyCollection keys;
private ValueCollection values;
protected BaseDictionary() { }
public abstract int Count { get; }
public abstract void Clear();
public abstract void Add(TKey key, TValue value);
public abstract bool ContainsKey(TKey key);
public abstract bool Remove(TKey key);
public abstract bool TryGetValue(TKey key, out TValue value);
public abstract IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator();
protected abstract void SetValue(TKey key, TValue value);
public bool IsReadOnly {
get { return false; }
}
public ICollection<TKey> Keys {
get {
if (this.keys == null)
this.keys = new KeyCollection(this);
return this.keys;
}
}
public ICollection<TValue> Values {
get {
if (this.values == null)
this.values = new ValueCollection(this);
return this.values;
}
}
public TValue this[TKey key] {
get {
TValue value;
if (!this.TryGetValue(key, out value))
throw new KeyNotFoundException();
return value;
}
set {
SetValue(key, value);
}
}
public void Add(KeyValuePair<TKey, TValue> item) {
this.Add(item.Key, item.Value);
}
public bool Contains(KeyValuePair<TKey, TValue> item) {
TValue value;
if (!this.TryGetValue(item.Key, out value))
return false;
return EqualityComparer<TValue>.Default.Equals(value, item.Value);
}
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) {
Copy(this, array, arrayIndex);
}
public bool Remove(KeyValuePair<TKey, TValue> item) {
if (!this.Contains(item))
return false;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
private abstract class Collection<T> : ICollection<T> {
protected readonly IDictionary<TKey, TValue> dictionary;
protected Collection(IDictionary<TKey, TValue> dictionary) {
this.dictionary = dictionary;
}
public int Count {
get { return this.dictionary.Count; }
}
public bool IsReadOnly {
get { return true; }
}
public void CopyTo(T[] array, int arrayIndex) {
Copy(this, array, arrayIndex);
}
public virtual bool Contains(T item) {
foreach (T element in this)
if (EqualityComparer<T>.Default.Equals(element, item))
return true;
return false;
}
public IEnumerator<T> GetEnumerator() {
foreach (KeyValuePair<TKey, TValue> pair in this.dictionary)
yield return GetItem(pair);
}
protected abstract T GetItem(KeyValuePair<TKey, TValue> pair);
public bool Remove(T item) {
throw new NotSupportedException("Collection is read-only.");
}
public void Add(T item) {
throw new NotSupportedException("Collection is read-only.");
}
public void Clear() {
throw new NotSupportedException("Collection is read-only.");
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
}
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(PREFIX + "DictionaryKeyCollectionDebugView`2" + SUFFIX)]
private class KeyCollection : Collection<TKey> {
public KeyCollection(IDictionary<TKey, TValue> dictionary)
: base(dictionary) { }
protected override TKey GetItem(KeyValuePair<TKey, TValue> pair) {
return pair.Key;
}
public override bool Contains(TKey item) {
return this.dictionary.ContainsKey(item);
}
}
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(PREFIX + "DictionaryValueCollectionDebugView`2" + SUFFIX)]
private class ValueCollection : Collection<TValue> {
public ValueCollection(IDictionary<TKey, TValue> dictionary)
: base(dictionary) { }
protected override TValue GetItem(KeyValuePair<TKey, TValue> pair) {
return pair.Value;
}
}
private static void Copy<T>(ICollection<T> source, T[] array, int arrayIndex) {
if (array == null)
throw new ArgumentNullException("array");
if (arrayIndex < 0 || arrayIndex > array.Length)
throw new ArgumentOutOfRangeException("arrayIndex");
if ((array.Length - arrayIndex) < source.Count)
throw new ArgumentException("Destination array is not large enough. Check array.Length and arrayIndex.");
foreach (T item in source)
array[arrayIndex++] = item;
}
}
wp7 BaseDictionary<TKey, TValue>的更多相关文章
- .net源码分析 – Dictionary<TKey, TValue>
接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blo ...
- .net源码分析 - ConcurrentDictionary<TKey, TValue>
List源码分析 Dictionary源码分析 ConcurrentDictionary源码分析 继上篇Dictionary源码分析,上篇讲过的在这里不会再重复 ConcurrentDictionar ...
- C# KeyValuePair<TKey,TValue>的用法-转载
C# KeyValuePair<TKey,TValue>的用法.结构体,定义可设置或检索的键/值对.也就是说我们可以通过 它记录一个键/值对这样的值.比如我们想定义一个ID(int类型)和 ...
- .NET中Dictionary<TKey, TValue>浅析
.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...
- .net学习笔记----有序集合SortedList、SortedList<TKey,TValue>、SortedDictionary<TKey,TValue>
无论是常用的List<T>.Hashtable还是ListDictionary<TKey,TValue>,在保存值的时候都是无序的,而今天要介绍的集合类SortedList和S ...
- IDictionary<TKey, TValue> vs. IDictionary
Enumerating directly over an IDictionary<TKey,TValue>returns a sequence of KeyValuePair struc ...
- Dictionary<TKey, TValue> 类
C# Dictionary<TKey, TValue> 类 Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.字典中的每个添加项都由一个值及 ...
- 线程安全集合 ConcurrentDictionary<TKey, TValue> 类
ConcurrentDictionary<TKey, TValue> 类 [表示可由多个线程同时访问的键/值对的线程安全集合.] 支持 .NET Framework 4.0 及以上. 示例 ...
- C# 字典 Dictionary<Tkey,Tvalue>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来.我们都知道计算机技术发展日新月异,速度惊人的快,你我稍不留神,就会被慢慢淘汰!因此:每日不间断的学习是避免被 ...
随机推荐
- TCP的那些事儿(上)
TCP的那些事儿(上) 原文链接:http://coolshell.cn/articles/11564.html TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面. ...
- win32控制台消息机制
源码: #include<windows.h>HANDLE hInput; /* 获取标准输入设备句柄 */INPUT_RECORD inRec;/* 返回数据记录 */DWORD num ...
- 动态插入、添加删除表格行的JS代码
<html> <head> <title>Table对象的方法</title> <script language="JavaScript ...
- spring bean id和bean name的区别
今天在分析问题时发现一个大家平时都不太注意的spring 配置问题,发出来分享下: 首先澄清一个概念: 同名bean:多个bean 有相同的 name 或者 id,称之为同名bean <bean ...
- 前端与php的sublime text3常用插件
sublime text各种版本下载:http://sublimetext.iaixue.com/dl/ 1.安装Package Control 快捷键: ctrl+` 粘贴内容后Enter: ...
- 文字编辑器kindeditor-min.js的使用
例子: <link rel="stylesheet" type="text/css" href="<?=$WebSiteRootDir?& ...
- Linux prerouting和postrouting的区别
我大概清楚一点就是从内网出去的时候用POSTROUTING进来的时候用PREROUTING,可是做透明代理的时候确是用PREROUTING.这是为什么呢? 回复: sunnygg pre还是post是 ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- Decompiled .class file,bytecode version:51.0(Java 7) Source for 'Android API 23 Platform' not found
今天在Android Studio中访问Java源码的时候,代码上方出现如下提示: 而且方法体中显示介样内容: throw new RuntimeException("Stub!" ...
- 【Hibernate】Hibernate系列3之配置文件详解
配置文件详解 3.1.配置文件 连接池性能优化:http://www.cnblogs.com/xdp-gacl/p/4002804.html