30

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

これが可能かどうか誰かが知っていますか?

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)を呼び出して、3つの項目をディクショナリに追加します。連想コレクションを初期化するこれらの2つの異なる方法は、コンパイラーが生成するメソッド呼び出しのために、わずかに異なる動作をします。どちらのバリアントもDictionaryクラスで機能します。他のタイプは、パブリックAPIに基づいてどちらか一方のみをサポートする場合があります。


私にとって、それは読みやすさの問題です。[]角かっこで値を取得することもできるので、何が行われたかを読んで理解する方がはるかに簡単だと思います。パフォーマンスについては何も知りませんが、最初の方法もより良いオプションだと思います。

于 2021-08-03T05:58:24.150 に答える