星辰.Net技术社区论坛

首页 » .NET » 算法/数据结构 » 构建可反转排序的泛型字典类(4)--IDictionary接口
admin - 2008-6-18 17:53:00
C#对集合类型有统一的规范。它的好处不言而喻,所有集合类都有一些统一的调用方法和属性,这使得学习成本大大降低。统一的规范就是通过接口来实现的(关于接口,如果不熟,请参考:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
http://www.enet.com.cn/eschool/video/c/30.shtml ),另一方面一些类也会直接调用这些标准接口,使得我们写出来的类有更好的兼容性。最典型的例子莫过于IEnumerable接口,只要实现了它就可以使用foreach语句进行调用。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
我们将要给ReversibleSortedList实现的是IDictionary接口,先来看看它的定义::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public interface IDictionary : ICollection,IEnumerable:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
ICollection接口是所有集合类的基接口,FCL中所有集合,不管是哪种方式的集合都实现它。IEnumerable接口则是枚举器接口,实现了它就可以使用foreach语句对它进行访问。IDictionary接口则继承自这两个接口,它表示键/值对的非通用集合。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
ICollection接口的定义为::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public interface ICollection : IEnumerable:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
从这个定义可以看出,所有集合类都应该支持foreach语句进行访问。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
1列出了各个接口的成员:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
接口:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
成员:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
说明:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
ICollection:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Count属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取 ICollection 中包含的元素数:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IsSynchronized属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取一个值,该值指示是否同步对 ICollection 的访问(线程安全):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
SyncRoot属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取可用于同步 ICollection 访问的对象:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
CopyTo方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
从特定的 Array 索引处开始,将 ICollection的元素复制到一个 Array 中:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IEnumerable:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
GetEnumerator方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
返回一个循环访问集合的枚举器:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IDictionary:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IsFixedSize属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取一个值,该值指示 IDictionary 对象是否具有固定大小:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IsReadOnly属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取一个值,该值指示 IDictionary 对象是否为只读:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Item属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取或设置具有指定键的元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Keys属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取 ICollection 对象,它包含 IDictionary 对象的键:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Values属性:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
获取 ICollection 对象,它包含 IDictionary 对象中的值:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Add方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
在 IDictionary 对象中添加一个带有所提供的键和值的元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Clear方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
从 IDictionary 对象中移除所有元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Contains方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
确定 IDictionary 对象是否包含具有指定键的元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
GetEnumerator方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
返回一个用于 IDictionary 对象的 IDictionaryEnumerator 对象:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Remove方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
从 IDictionary 对象中移除带有指定键的元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
从上表可以看出,实现IDictionary接口并不简单。我个人喜欢先把复杂的问题简单化,但所要实现的东西实在太多,只能尽力而为。如果在我们之前所构建的ReversibleSortedList类中加上这么代码将不利于理解如何实现IDictionary接口。所以我从MSDNcopy了一段IDictionary接口实现的代码,并把所有属于出错判断的部分咔嚓掉,先让大家对IDictionary接口有个了解后再给ReversibleSortedList类实现它。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
实现这个接口需要注意以下几点::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
1.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IEnumerable接口的GetEnumerator方法的实现,这个方法的原型为::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IEnumerator GetEnumerator():“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
也就是说这个方法返回的是一个实现了IEnumerator的类,IEnumerator接口的成员如下::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Current属性:获取集合中的当前元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
MoveNext方法:将枚举数推进到集合的下一个元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Reset方法:将枚举数设置为其初始位置,该位置位于集合中第一个元素之前:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
实现了IEnumerator接口的类可以通过一个内部类来实现,又要多实现三个成员,事态变得进一步复杂。关于IEnumerable接口实现,如果不懂可以上网搜搜,能搜一大箩筐出来,也可以参考设计模式中的“Iterator 迭代器模式”进行学习。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IDictionary接口中有自己的GetEnumerator方法,它返回的IEnumerator接口的子接口:IDictionaryEnumerator接口。这个接口的定义为::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public interface IDictionaryEnumerator : IEnumerator:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
它的成员为::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Entry:同时获取当前字典项的键和值:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Key:获取当前字典项的键:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Value:获取当前字典项的值:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
这意味着除了要实现IEnumerable接口的三个成员外,还要实现它自己的三个成员,变得更复杂了,晕!值得庆幸的是由于IDictionaryEnumerator接口继承自IEnumerator接口,可以把IDictionaryEnumerator接口强制转换为IEnumerator接口用于实现IEnumerable接口的GetEnumerator方法。当然,由于两个方法同名,只能给IEnumerable接口用显示接口成员实现了。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
2.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Item属性,这个属性并不是叫你实现了个名字叫“Item”的属性,而是一个索引器,通过实例名加方括号中的索引来访问集合里的元素。关于索引器,如果不熟,请参考::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
http://www.enet.com.cn/eschool/video/c/20.shtml :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
3.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Keys属性,这个属性的原型为::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
ICollectionKeys { get; }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
也就是说,它返回一个实现了ICollection接口的类。ICollection接口前面已经讲过,C#中的所有集合类都实现了它。本例中这个属性返回的是一个数组,因为数组也实现了ICollection接口。另外Values属性也是同样的情况。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
4.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
本例中,字典集合里的一个元素是由键和值组成的,这一个元素使用了FCL中现成的DictionaryEntry来实现,它定义了可设置或检索的字典键/值对。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
下面列出了代码,请大家参照注释进行理解。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
IDictionary接口的实现(以下代码可直接拷贝并运行):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
using System;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
using System.Collections;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public class SimpleDictionary : IDictionary:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
private DictionaryEntry[] items; //用数组存放元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    private Int32 ItemsInUse = 0; //元素个数:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//指定存储空间的构造方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    public SimpleDictionary(Int32 numItems):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        items
= new DictionaryEntry[numItems];:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#region IDictionary 成员:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public bool IsReadOnly { get { return false; } }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public bool Contains(object key):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    { 
//检测是否包含指定的key键:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
      Int32 index;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
     
return TryGetIndexOfKey(key, out index);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public bool IsFixedSize { get { return false; } }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public void Remove(object key):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    { 
//移除指定键的元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        Int32 index;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
if (TryGetIndexOfKey(key, out index)):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        { 
//把移除元素后面的所有元素向前移动一个位置:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Array.Copy(items, index + 1, items, index, ItemsInUse - index - 1);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            ItemsInUse
--;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        } :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public void Clear() { ItemsInUse = 0; } //清除所有元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    public void Add(object key, object value) :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    { 
//添加一个元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        items[ItemsInUse++] = new DictionaryEntry(key, value);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public ICollection Keys:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    { 
//返回所有键的集合:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        get:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        { 
//把所有键的集合拷贝到新数组中并返回:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Object[] keys = new Object[ItemsInUse];:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
for (Int32 n = 0; n < ItemsInUse; n++):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                keys[n]
= items[n].Key;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
return keys;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public ICollection Values:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    { 
//返回所有值的集合:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        get:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        { 
//把所有值的集合拷贝到新数组中并返回:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Object[] values = new Object[ItemsInUse];:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
for (Int32 n = 0; n < ItemsInUse; n++):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                values[n]
= items[n].Value;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
return values;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public object this[object key]:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    { 
//item属性的实现,也就是索引器:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        get:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Int32 index;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
if (TryGetIndexOfKey(key, out index)):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
               
return items[index].Value;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            } :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
return null;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
set:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Int32 index;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
if (TryGetIndexOfKey(key, out index)):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                items[index].Value
= value;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            } :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
else:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                Add(key, value);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//这个方法有两个作用,第一是查找指定键是否存在:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//第二是返回指定键的索引:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    private Boolean TryGetIndexOfKey(Object key, out Int32 index):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
for (index = 0; index < ItemsInUse; index++):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
if (items[index].Key.Equals(key)) return true;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
return false;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//用于迭代的嵌套类,它同时实现了IEnumerator和IDictionaryEnumerator:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    private class SimpleDictionaryEnumerator : IDictionaryEnumerator:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        DictionaryEntry[] items;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        Int32 index
= -1;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
//构造方法,用于获得SimpleDictionary类的所有元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        public SimpleDictionaryEnumerator(SimpleDictionary sd):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            items
= new DictionaryEntry[sd.Count];:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Array.Copy(sd.items,
0, items, 0, sd.Count);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
public Object Current :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        { :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
get { return items[index]; }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
public DictionaryEntry Entry:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
get { return (DictionaryEntry) Current; }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
public Object Key { get { return items[index].Key; } }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
public Object Value { get { return items[index].Value; } }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
public Boolean MoveNext():“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
if (index < items.Length - 1) { index++; return true; }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
return false;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
public void Reset():“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            index
= -1;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//实现IDictionary接口中的GetEnumerator方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    public IDictionaryEnumerator GetEnumerator():“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
return new SimpleDictionaryEnumerator(this);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#endregion:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#region ICollection 成员:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public bool IsSynchronized { get { return false; } }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//这句够简化,直接弹出异常不给使用:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    public object SyncRoot { get { throw new NotImplementedException(); } }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public int Count { get { return ItemsInUse; } }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public void CopyTo(Array array, int index) { throw new NotImplementedException(); }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#endregion:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#region IEnumerable 成员:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//实现IEnumerable接口的GetEnumerator方法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    IEnumerator IEnumerable.GetEnumerator() :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 这里使用了强制类型转换.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        return ((IDictionary)this).GetEnumerator();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#endregion:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public sealed class App:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
static void Main():“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 创建一个只能包含三个元素的字典类:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        IDictionary d = new SimpleDictionary(3);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 添加三个人名和它们的年龄到字典内:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        d.Add("Jeff", 40);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        d.Add(
"Kristin", 34);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        d.Add(
"Aidan", 1);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        Console.WriteLine(
"字典元素个数= {0}", d.Count);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        Console.WriteLine(
"字典中是否包含'Jeff'? {0}", d.Contains("Jeff"));:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        Console.WriteLine(
"Jeff的年龄是:{0}", d["Jeff"]);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 显示字典中的所有键和值,由于实现了IDictionaryEnumerator接口:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
//所以可以使用foreach进行调用:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        foreach (DictionaryEntry de in d):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Console.WriteLine(
"{0} is {1} years old.", de.Key, de.Value);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 移除“Jeff”:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        d.Remove("Jeff");:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 移除不存在的元素不会引发异常:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        d.Remove("Max");:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 显示字典中的所有人名(key):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        foreach (String s in d.Keys):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Console.WriteLine(s);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
// 显示字典中的所有年龄(value):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        foreach (Int32 age in d.Values):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            Console.WriteLine(age);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
系列导航:
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
1
查看完整版本: 构建可反转排序的泛型字典类(4)--IDictionary接口