通过内联初始化容器向字典添加值

42
我有以下的 City 类。每个城市对象都包含一个字典,其中键为语言标签(比如:“EN”,“DE”,“FR”...),值是相应语言中的城市名称(例如:罗马/ 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" } } };

有人知道这是否可能吗?

3个回答

71

这是实际的内联初始化:

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

23
AllCities.Add(new City("Rome") { Names = { { "DE", "Rom" }, { "...", "..." } } });

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


这将覆盖构造函数中添加的值,就像提问者提供的最后一个代码块一样。 - Rawling
4
不会的。它将添加到现有的词典中,而不是创建一个新的词典。 - usr
1
(那是一些奇怪的初始化语法。你每天都会学到新东西。) - Rawling
1
该死,我很确定那是我尝试的第一件事...确实有效。非常感谢! - Timothée Bourguignon
你应该提供一个至少包含两个条目的字典示例 :) - Andre Pena
显示剩余2条评论

6

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

Dictionary<string, string> dict = new()
{
    ["key1"] = "value1",
    ["key2"] = "value2",
    ["key3"] = "value"
};

编辑:关于楼主的解释请求

来自对象和集合初始化程序(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支持其中一种。
对我来说,这只是可读性问题。我认为使用[]括号也可以检索值,更容易阅读和理解所做的事情。虽然我不知道性能方面的情况,但我想第一种方式也是更好的选择。

感谢您的回答。鉴于这个问题是来自2012年,我想补充一下,索引器方式您所建议的是在C#6.0中引入的。您能解释一下为什么您认为它更好吗? - Timothée Bourguignon
@TimothéeBourguignon 我添加了解释。希望这有所帮助。 - baltermia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接