如果密钥不存在,C#自定义字典类型与setter

时间:2017-06-02 22:56:15

标签: c# dictionary setter

我正在尝试定义一个扩展DIctionary的自定义类型,只有一个区别。当我设置这样的值时:

myCustomDic[3.5] = 4.0;

首先检查密钥3.5是否存在。如果是,则将值设置为新值。否则它会添加具有新值的键。我是这样做的:

class Dic : Dictionary<double, double>
    {
        private readonly Dictionary<double, double> _property;
        public Dic(Dictionary<double, double> property)
        {
            _property = property;
        }
        //Indexer: 
        public new double this[double CA]
        {
            get
            {
                return _property[CA];
            }
            set
            {
                if (_property.ContainsKey(CA))
                {
                    _property[CA] = value;
                }
                else
                {
                    _property.Add(CA, value);
                }
            }
        }
    }

我这样用它:

var testDic = new Dic(new Dictionary<double, double>());
testDic[2.5] = 4.0;

但是testDic没有添加键和值对? 有人可以告诉你为什么吗?

2 个答案:

答案 0 :(得分:4)

因为您是Dictionary的子类,所以您也不需要自己的私人词典。此外,您描述的行为是Dictionary已经如何运作,因此您根本不需要创建自己的类:

var t2 = new Dictionary<double, double>();

t2[2.5] = 4.0;
Console.WriteLine(t2[2.5]);  // outputs 4
t2[2.5] = 8.0;
Console.WriteLine(t2[2.5]);  // outputs 8

来自Dictionary<TKey, TValue>.Item Property (TKey)的文档:

设置属性值时,如果键位于“词典”中,则与该键关联的值将替换为指定的值。如果该键不在词典中,则键和值将添加到词典中。

但你可以:

class Dic : Dictionary<double, double> {
    //Indexer: 
    public new double this[double CA] {
        get => (this as Dictionary<double, double>)[CA];
        set {
            var parent = this as Dictionary<double, double>;
            if (parent.ContainsKey(CA))
                parent[CA] = value;
            else
                parent.Add(CA, value);
        }
    }
}

然后你可以这样做:

var testDic = new Dic();

testDic[2.5] = 4.0;
Console.WriteLine(testDic[2.5]); // this outputs 4
testDic[2.5] = 8.0;
Console.WriteLine(testDic[2.5]);  // this outputs 8

答案 1 :(得分:0)

这是因为您检查了Count属性,该属性保持为零,因为您没有覆盖它。

你的_property的数量会增加但不会增加。

调试器可视化工具仍将调用原始的字典计数,该计数仍会报告0,但如果将其打印到控制台,它将起作用。

我仍然不明白为什么你从词典派生,因为你描述你的要求的方式已经由词典实现。

public TValue this[TKey key]
{
    get
    {
        int num = this.FindEntry(key);
        if (num >= 0)
        {
            return this.entries[num].value;
        }
        ThrowHelper.ThrowKeyNotFoundException();
        return default(TValue);
    }
    set
    {
        this.Insert(key, value, false);
    }
}