C# 多维字典,带“;如果键不在字典中,则添加新值;

C# 多维字典,带“;如果键不在字典中,则添加新值;,c#,dictionary,initialization,C#,Dictionary,Initialization,在这方面也有类似的问题,但都没有回答我的问题 我想要一本用于翻译的二维词典。大概是这样的: Dictionary["DE"][TranslationKeys.Title] = "Title in German"; Dictionary["DE"][TranslationKeys.SubTitle] = "Subtitle in German"; Dictionary["PL"][TranslationKeys.Title] = "Title in Polish"; Dictionary["PL"

在这方面也有类似的问题,但都没有回答我的问题

我想要一本用于翻译的二维词典。大概是这样的:

Dictionary["DE"][TranslationKeys.Title] = "Title in German";
Dictionary["DE"][TranslationKeys.SubTitle] = "Subtitle in German";
Dictionary["PL"][TranslationKeys.Title] = "Title in Polish";
Dictionary["PL"][TranslationKeys.SubTitle] = "Subtitle in Polish";
Dictionary["EN"][TranslationKeys.Title] = "Title in English";
Dictionary["EN"][TranslationKeys.SubTitle] = "Subtitle in English";
Dictionary = new Dictionary<string,Dictionary<TranslationKeys,string>>(){
                {"PL",new Dictionary<TranslationKeys,string>(){{TranslationKeys.SubTitle,"Subtitle in Polish"}}}
            };
Dictionary["PL"][TranslationKeys.SubTitle] = "Subtitle in Polish";
Dictionary["EN"][TranslationKeys.Title] = "Title in English";
Dictionary["PL"][TranslationKeys.SubTitle] = "SubTitle in Polish";
Dictionary["EN"][TranslationKeys.SubTitle] = "SubTitle in English";
Dictionary["DE"][TranslationKeys.SubTitle] = "SubTitle in German";
如果我使用传统的字典,比如
字典

但是我不想像这样用“丑陋”的方式初始化它:

Dictionary["DE"][TranslationKeys.Title] = "Title in German";
Dictionary["DE"][TranslationKeys.SubTitle] = "Subtitle in German";
Dictionary["PL"][TranslationKeys.Title] = "Title in Polish";
Dictionary["PL"][TranslationKeys.SubTitle] = "Subtitle in Polish";
Dictionary["EN"][TranslationKeys.Title] = "Title in English";
Dictionary["EN"][TranslationKeys.SubTitle] = "Subtitle in English";
Dictionary = new Dictionary<string,Dictionary<TranslationKeys,string>>(){
                {"PL",new Dictionary<TranslationKeys,string>(){{TranslationKeys.SubTitle,"Subtitle in Polish"}}}
            };
Dictionary["PL"][TranslationKeys.SubTitle] = "Subtitle in Polish";
Dictionary["EN"][TranslationKeys.Title] = "Title in English";
Dictionary["PL"][TranslationKeys.SubTitle] = "SubTitle in Polish";
Dictionary["EN"][TranslationKeys.SubTitle] = "SubTitle in English";
Dictionary["DE"][TranslationKeys.SubTitle] = "SubTitle in German";
所以我试着实现一个“智能”多维字典,如果他得到了值或者没有得到值,它会自动计算出来。到目前为止,我所做的是一个使用字典和特殊索引器的新泛型类:

public class TranslateDictionary<TKey, TValue> where TValue : new()
{
    private Dictionary<TKey, TValue> Dictionary;
    public TValue this[TKey lang]
    {
        get
        {
            if (!Dictionary.ContainsKey(lang))
            {
                TValue obj = new TValue();
                Dictionary.Add(lang, new TValue());
            }
            return Dictionary[lang];
        }
        set
        {
            Dictionary[lang] = value;
        }
    }
}

也许我应该使用其他类型的集合,而不是我不知道的字典,来解决我的问题

我做到了。我只需要稍微改变一下我的索引器。以下是实现这一目标的方法:

public class TranslateDictionary<TKey, TValue>
{
    private Dictionary<TKey, TValue> Dictionary = new Dictionary<TKey,TValue>();
    public TValue this[TKey lang]
    {
        get
        {
            if (!Dictionary.ContainsKey(lang))
            {
                Dictionary.Add(lang, Activator.CreateInstance<TValue>());
            }
            return Dictionary[lang];
        }
        set
        {
            Dictionary[lang] = value;
        }
    }
}
也许这种方法比普通字典慢,因为每次尝试读取值时都会检查内部字典是否包含键,但至少可以以“更干净”的方式为其分配元素

更新 我把我的翻译医学提升了一点。我添加了布尔属性“Initialized”。现在在初始化之后,我可以将该值设置为“true”,并且不再检查字典中是否存在该值。然后它会更像正常的发音类型

public class TranslateDictionary<TKey, TValue>
{
    public bool Initialized { get; set; }
    private Dictionary<TKey, TValue> Dictionary = new Dictionary<TKey,TValue>();
    public TValue this[TKey lang]
    {
        get
        {
            if (!Initialized)
            {
                if (!Dictionary.ContainsKey(lang))
                {
                    Dictionary.Add(lang, Activator.CreateInstance<TValue>());
                }
            }
            return Dictionary[lang];
        }
        set
        {
            Dictionary[lang] = value;
        }
    }
}
公共类TranslateDictionary
{
公共bool已初始化{get;set;}
私有字典=新字典();
公共TValue this[TKey lang]
{
得到
{
如果(!已初始化)
{
if(!Dictionary.ContainsKey(lang))
{
Add(lang,Activator.CreateInstance());
}
}
返回字典[lang];
}
设置
{
字典[lang]=值;
}
}
}

看看这个:你知道你设置了一个临时的TValue,但从来没有正确使用过它?。。