30

我有以下City课程。每个城市对象都包含一个字典,其中键是语言标签(比如说:“EN”、“DE”、“FR”...),而值是相应语言中的城市名称(例如:Rome / Rom 等) .

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" } } };

有人知道这是否可能吗?

4

3 回答 3

56

这是实际的内联初始化:

private IDictionary<string, string> localizedNames = new Dictionary<string, string>{
    {"key1","value1"},
    {"key2","value2"}
};
于 2017-03-10T23:11:41.023 回答
23
AllCities.Add(new City("Rome") { Names = { { "DE", "Rom" }, { "...", "..." } } });

这是使用初始化语法来调用 .Add 方法。

于 2012-06-12T14:46:45.827 回答
2

有一个比使用匿名对象更好的方法:

IDictionary<string, string> dict = new Dictionary<string, string>
{
    ["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 的一种或另一种。


对我来说,这只是一个可读性的东西。我认为阅读和理解所做的工作更容易,因为您还可以使用[]括号检索值。我对性能一无所知,但我想第一种方法也是更好的选择。

于 2021-08-03T05:58:24.150 回答