7

キーとアイテムを格納できるリング リスト ディクショナリが必要です。Capacity = 50最初のアイテムを追加#51するときは、削除する必要があります。基本的には、リングリストのように振る舞う辞書でなければなりません。

それを行うことができる.NET Frameworkに何かありますか? それとも自分で書かなければなりませんか?

4

3 に答える 3

5

組み込みのものは何も見つからないと思いますが、OrderedDictionaryを使用して簡単に実装できます

OrderedDictionary挿入された順序でアイテムを維持します。制限/容量に達すると、最初のアイテムを削除できます。

于 2013-08-06T10:39:26.350 に答える
2

これを試して:

class Program
{
    static void Main(string[] args)
    {
        var rD = new RingDictionary(50);
        for (int i = 0; i < 75; i++)
        {
            rD.Add(i, i);
        }
        foreach (var item in rD.Keys)
        {
            Console.WriteLine("{0} {1}", item, rD[item]);
        }
    }
}

class RingDictionary : OrderedDictionary
{
    int indexKey;

    int _capacity = 0;
    public int Capacity
    {
        get { return _capacity; }
        set
        {
            if (value <= 0)
            {
                var errorMessage = typeof(Environment)
                    .GetMethod(
                        "GetResourceString",
                        System.Reflection.BindingFlags.Static |
                        System.Reflection.BindingFlags.NonPublic,
                        null,
                        new Type[] { typeof(string) },
                        null)
                    .Invoke(null, new object[] { 
                        "ArgumentOutOfRange_NegativeCapacity" 
                    }).ToString();
                throw new ArgumentException(errorMessage);
            }
            _capacity = value;
        }
    }

    public RingDictionary(int capacity)
    {
        indexKey = -1;
        Capacity = capacity;
    }

    public new void Add(object key, object value)
    {
        indexKey++;

        if (base.Keys.Count > _capacity)
        {
            for (int i = base.Keys.Count-1; i >Capacity-1 ; i--)
            {
                base.RemoveAt(i);
            }
        }

        if (base.Keys.Count == _capacity)
        {
            base.RemoveAt(indexKey % _capacity);
            base.Insert(indexKey % _capacity, key, value);
        }
        else
        {
            base.Add(key, value);
        }
    }
}
于 2013-08-06T11:00:17.283 に答える