首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

打造可逆向排序的泛型字典類 (八):實作泛型 IDictionary<TKey,TValue> 介面與測試

     編輯:關於C語言

類別宣告調整


public class ReversibleSortedList<TKey, TValue> : 
    IDictionary<TKey, TValue>, IDictionary,
    IEnumerable<KeyValuePair<TKey, TValue>>, ICollection,
    IEnumerable, ICollection<KeyValuePair<TKey, TValue>>

ICollection<KeyValuePair> 成員實作


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;
}

RemoveAt 輔助方法


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

泛型介面核心成員已就緒,下階段完善建構子、排序切換與修剪容量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved