无法将值设置为Dictionary Key

时间:2017-12-06 19:53:31

标签: c#

我陷入了一种奇怪的境地,所以基本上我需要创建一个Dictionary,其字符串为Key,自定义对象为ValueDictionary有这个实现:

public static Dictionary<string, ForecastType> FullTime
{
    get
    {
        return new Dictionary<string, ForecastType>()
        {
            { "1", new ForecastType { Type = SignType.PartialFinal, Sign = Signs.HomeHomePF } },
            ...
        }
    }
}

你可以看到密钥是1,而值是一个名为ForecastType的自定义类:

public class ForecastType : ViewModel
{
    private double _value;

    public double Value
    {
        get { return _value; }
        set
        {
            _value = value;
            OnPropertyChanged();
        }
    }

    public Signs Sign { get; set; }
    public SignType Type { get; set; }
}

属性SignType不需要解释,它只是Enum的实现。 相反,属性Value让我很头疼。特别是我无法将值设置为此属性,我指定的每个值都得到0

我还实施了ViewModel,我虽然遇到了与PropertyChanged相关的问题,但即使这样也没有解决问题。

我以这种方式对Value属性进行了增值:

FullTime["1"].Value = 5;

请注意,OnPropertyChanged()被正确调用,其中的value5,但是当我设置断点时,后来FullTime["1"]..行获得{ {1}}“0”。

我做错了什么?

感谢您的帮助。最好的祝福。

3 个答案:

答案 0 :(得分:2)

问题出在FullTime属性本身。 始终会返回字典:

get
{
    return new Dictionary<string, ForecastType>() {...};
}

每当你打电话给它时,无论是在 字典中设置或获取任何内容,你都会得到一本全新的字典。内存中没有字典。

在类中保存一个实例,然后返回那个实例。也许是这样的:

private static Dictionary<string, ForecastType> _myDict;

public static Dictionary<string, ForecastType> FullTime
{
    get
    {
        if (_myDict == null)
            _myDict = new Dictionary<string, ForecastType>() {...};
        return _myDict;
    }
}

这样,它将在您第一次调用该属性时进行初始化,对该属性的任何后续调用都将生成以前初始化的字典。

答案 1 :(得分:1)

您的FullTime只有一个getter,无论何时调用都会返回一个 new 字典,其默认值为ForecastType.Value。一种可能的解决方案如下:

public static Dictionary<string, ForecastType> FullTime { get; } = 
    new Dictionary<string, ForecastType>
    {
        { "1", new ForecastType 
            { 
                Type = SignType.PartialFinal, 
                Sign = Signs.HomeHomePF 
            } 
        // ...
    };

不同之处在于,现在您创建的属性仅包含getter 但具有默认值,无法更改。此值是对字典Dictionary<string, ForecastType>的引用。每当您读取此属性的值时,您将获得相同的引用,但现在您可以通过向字典添加新项,更改值等来改变此引用指向的对象的状态。

答案 2 :(得分:1)

不是让FullTime属性的getter返回一个新的字典,你可以从C#6开始为这个属性提供一个默认值:

public static Dictionary<string, ForecastType> FullTime {get;} = new Dictionary<string, ForecastType> () { /* initial dictionary values go here */ };