以陣列存儲 `DictionaryEntry`,展示介面實現骨架:
public class SimpleDictionary : IDictionary
{
private DictionaryEntry[] _items;
private int _count;
public SimpleDictionary(int capacity) => _items = new DictionaryEntry[capacity];
#region IDictionary
public bool IsReadOnly => false;
public bool IsFixedSize => false;
public object this[object key]
{
get
{
int idx = IndexOfKey(key);
return idx >= 0 ? _items[idx].Value : null;
}
set
{
int idx = IndexOfKey(key);
if (idx >= 0) _items[idx].Value = value;
else Add(key, value);
}
}
public ICollection Keys
{
get
{
var keys = new object[_count];
for (int i = 0; i < _count; i++) keys[i] = _items[i].Key;
return keys;
}
}
public ICollection Values
{
get
{
var vals = new object[_count];
for (int i = 0; i < _count; i++) vals[i] = _items[i].Value;
return vals;
}
}
public void Add(object key, object value)
=> _items[_count++] = new DictionaryEntry(key, value);
public void Clear() => _count = 0;
public bool Contains(object key) => IndexOfKey(key) >= 0;
public IDictionaryEnumerator GetEnumerator()
=> new SimpleEnumerator(this);
public void Remove(object key)
{
int idx = IndexOfKey(key);
if (idx >= 0)
{
Array.Copy(_items, idx + 1, _items, idx, _count - idx - 1);
_count--;
}
}
private int IndexOfKey(object key)
{
for (int i = 0; i < _count; i++)
if (_items[i].Key.Equals(key)) return i;
return -1;
}
#endregion
#region ICollection
public int Count => _count;
public bool IsSynchronized => false;
public object SyncRoot => this;
public void CopyTo(Array array, int index) => throw new NotImplementedException();
#endregion
#region IEnumerable
IEnumerator IEnumerable.GetEnumerator() => ((IDictionary)this).GetEnumerator();
#endregion
// 內部枚舉器:複製數據避免並發問題(教學簡化)
private class SimpleEnumerator : IDictionaryEnumerator
{
private readonly DictionaryEntry[] _items;
private int _index = -1;
public SimpleEnumerator(SimpleDictionary dict)
{
_items = new DictionaryEntry[dict.Count];
Array.Copy(dict._items, _items, dict.Count);
}
public object Current => _items[_index];
public DictionaryEntry Entry => (DictionaryEntry)Current;
public object Key => _items[_index].Key;
public object Value => _items[_index].Value;
public bool MoveNext() => ++_index < _items.Length;
public void Reset() => _index = -1;
}
}
static void Main()
{
IDictionary dict = new SimpleDictionary(3);
dict.Add("Jeff", 40);
dict.Add("Kristin", 34);
dict.Add("Aidan", 1);
Console.WriteLine($"Count: {dict.Count}");
Console.WriteLine($"Contains 'Jeff': {dict.Contains("Jeff")}");
Console.WriteLine($"Jeff's age: {dict["Jeff"]}");
foreach (DictionaryEntry de in dict)
Console.WriteLine($"{de.Key} is {de.Value} years old.");
dict.Remove("Jeff");
dict.Remove("Max"); // 不拋異常
foreach (string key in dict.Keys) Console.WriteLine(key);
foreach (int age in dict.Values) Console.WriteLine(age);
}
理解 `IDictionary` 介面契約、索引器語法、枚舉器模式、顯式介面實現,是構建高性能泛型字典的基石。下一篇將引入泛型、二分查找、自動擴容、自定義比較器,邁向生產級實現。