web-dev-qa-db-ja.com

Dictionary <TKey、TValue>エントリにコレクション初期化子を使用できますか?

次のコードにコレクション初期化子を使用したい:

public Dictionary<int, string> GetNames()
{
    Dictionary<int, string> names = new Dictionary<int, string>();
    names.Add(1, "Adam");
    names.Add(2, "Bart");
    names.Add(3, "Charlie");
    return names;
}

したがって、通常は次のようになります。

return new Dictionary<int, string>
{ 
   1, "Adam",
   2, "Bart"
   ...

しかし、これの正しい構文は何ですか?

94
Gerrie Schenck
var names = new Dictionary<int, string> {
  { 1, "Adam" },
  { 2, "Bart" },
  { 3, "Charlie" }
};
156
bruno conde

構文はわずかに異なります。

Dictionary<int, string> names = new Dictionary<int, string>()
{
    { 1, "Adam" },
    { 2, "Bart" }
}

値のタプルを効果的に追加していることに注意してください。

補足:コレクション初期化子には、基本的に、コンパイル時の引数のタイプに関して便利なAdd()関数に対する引数である引数が含まれています。つまり、コレクションがある場合:

class FooCollection : IEnumerable
{
    public void Add(int i) ...

    public void Add(string s) ...

    public void Add(double d) ...
}

次のコードは完全に合法です:

var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" };
35
Anton Gogolev
return new Dictionary<int, string>
{ 
   { 1, "Adam" },
   { 2, "Bart" },
   ...
11
ybo

質問にはc#-3.0、ただし完全を期すために、Visual Studio 2015(またはMono 4.0)を使用している場合にC#6で使用可能な新しい構文について説明します。

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie"
};

注:他の回答で言及されている古い構文は、それでもよければそれでも動作します。繰り返しになりますが、完全を期すために、古い構文を次に示します。

var dictionary = new Dictionary<int, string>
{
   { 1, "Adam" },
   { 2, "Bart" },
   { 3, "Charlie" }
};

注意すべきもう1つのクールな点は、どちらの構文でも、必要に応じて最後のカンマを残すことができることです。これにより、追加の行をコピー/貼り付けしやすくなります。たとえば、次のコードは問題なくコンパイルできます。

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie",
};
10
Nate Cook

少し冗長な構文を探している場合は、次のようなDictionary<string, object>(またはあなたの型は何でも)のサブクラスを作成できます:

public class DebugKeyValueDict : Dictionary<string, object>
{

}

次に、このように初期化します

var debugValues = new DebugKeyValueDict
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

これは同等です

var debugValues = new Dictionary<string, object>
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

言うことができるなど、あなたが望むかもしれないすべてのコンパイルタイプのものを得ることの利点

is DebugKeyValueDictの代わりにis IDictionary<string, object>

または、後日キーまたは値のタイプを変更します。かみそりのcshtmlページ内でこのようなことをしているなら、見たほうがずっといいです。

冗長性が低いことに加えて、もちろん、このクラスに必要なメソッドを追加できます。

5
Simon_Weaver

次のコード例では、Dictionary<TKey, TValue>は、StudentName型のインスタンスで初期化されます。

  Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
  {
      { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}},
      { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}},
      { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}
  };

from msdn

1
Bellash