public class ReversibleSortedList<TKey, TValue> :
IDictionary<TKey, TValue>, IDictionary,
IEnumerable<KeyValuePair<TKey, TValue>>, ICollection,
IEnumerable, ICollection<KeyValuePair<TKey, TValue>>
bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly => false;
void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> kvp)
=> Add(kvp.Key, kvp.Value);
bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> kvp)
{
int idx = IndexOfKey(kvp.Key);
return idx >= 0 && EqualityComparer<TValue>.Default.Equals(values[idx], kvp.Value);
}
void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
// 參數驗證後直接複製 KeyValuePair
for (int i = 0; i < Count; i++)
array[arrayIndex + i] = new KeyValuePair<TKey, TValue>(keys[i], values[i]);
}
bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> kvp)
{
int idx = IndexOfKey(kvp.Key);
if (idx >= 0 && EqualityComparer<TValue>.Default.Equals(values[idx], kvp.Value))
{ RemoveAt(idx); return true; }
return false;
}
public void RemoveAt(int index)
{
if (index < 0 || index >= _size) throw new ArgumentOutOfRangeException(nameof(index));
_size--;
if (index < _size)
{
Array.Copy(keys, index + 1, keys, index, _size - index);
Array.Copy(values, index + 1, values, index, _size - index);
}
keys[_size] = default; values[_size] = default; version++;
}
var rs = new ReversibleSortedList<string, string>();
rs.Add("3","a"); rs.Add("1","b"); rs.Add("2","c"); rs.Add("6","d"); rs.Add("5","e"); rs.Add("4","f");
foreach (var d in rs) Console.WriteLine($"{d.Key} {d.Value}");
// 移除 "2" 與 "5"
rs.Remove("2"); rs.Remove("5");
foreach (var d in rs) Console.WriteLine($"{d.Key} {d.Value}");
1 b
2 c
3 a
4 f
5 e
6 d
移除後:
1 b
3 a
4 f
6 d
泛型介面核心成員已就緒,下階段完善建構子、排序切換與修剪容量。