通过字典容器的内联初始化将值添加到字典中
本文关键字:字典 添加 初始化 | 更新日期: 2023-09-27 18:36:59
我有以下City
类。每个城市对象都包含一个字典,其中键是语言标签(假设:"EN","DE","FR"...),哪些值是相应语言中的城市名称(例如:罗马/罗姆等)。
public class City:
{
private IDictionary<string, string> localizedNames = new Dictionary<string, string>(0);
public virtual IDictionary<string, string> Names
{
get { return localizedNames ; }
set { localizedNames = value; }
}
}
无论使用哪种语言,大多数城市都有相同的名称,因此City
构造函数实际上会创建英语映射:
public City(string cityName)
{
this.LocalizedNames.Add("EN", cityName);
}
问题来了:有没有办法通过内联初始化添加其他值?
我尝试了以下不同的变体,但没有语义成功(不编译):
AllCities.Add(new City("Rome") { Names["DE"] = "Rom" };
我也尝试创建一个新的字典,但这显然覆盖了"EN"参数:
AllCities.Add(new City("Rome") { Names = new Dictionary<string, string>() { { "DE", "Rom" } } };
有人知道这是否可能吗?
这是
实际的内联初始化:
private IDictionary<string, string> localizedNames = new Dictionary<string, string>{
{"key1","value1"},
{"key2","value2"}
};
更新:如果使用的是 C# 6.0 或更高版本,则还支持基于键值的语法:
IDictionary<string, string> localizedNames = new Dictionary<string,string>
{
["key1"] = "value1",
["key2"] = "value2",
["key3"] = "value3"
};
AllCities.Add(new City("Rome") { Names = { { "DE", "Rom" }, { "...", "..." } } });
这是使用初始值设定项语法来调用 .添加方法。
有一种
比使用匿名对象更好的方法:
Dictionary<string, string> dict = new()
{
["key1"] = "value1",
["key2"] = "value2",
["key3"] = "value"
};
<小时 />编辑:关于OP要求解释
从对象和集合初始值设定项(C# 编程指南):
var numbers = new Dictionary<int, string>
{
[7] = "seven",
[9] = "nine",
[13] = "thirteen"
};
前面的示例生成调用 Item[TKey] 以设置值的代码。在 C# 6 之前,可以使用以下语法初始化字典和其他关联容器。请注意,它使用具有多个值的对象,而不是带有括号和赋值的索引器语法:
var moreNumbers = new Dictionary<int, string>
{
{19, "nineteen" },
{23, "twenty-three" },
{42, "forty-two" }
};
<小时 />此初始值设定项示例调用 Add(TKey, TValue) 以将这三个项添加到字典中。这两种初始化关联集合的不同方法的行为略有不同,因为编译器生成的方法调用。两种变体都适用于
Dictionary
类。其他类型可能仅基于其公共 API 支持其中一种。
对我来说,这只是一个可读性问题。我认为阅读和理解所做的事情更容易,因为您还可以使用[]
括号检索值。我对性能一无所知,但我想第一种方法也是更好的选择。