web-dev-qa-db-ja.com

KeyValuePairオブジェクトを適切な方法で初期化する方法は?

(とりわけ) この質問 で、人々はKeyValuePairのインスタンスを初期化する方法を疑問に思っています。こんな風に見える。

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{ 
  Key = 1,
  Value = 2
};

プロパティが存在しないかのように機能しません。 Intead、私はこのようなコンストラクタを使用する必要があります。

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);

確かに短い構文ですが、イニシャライザを使用できないのは気になります。私は何を間違えていますか?

44
user1672517

を使用してkeyValuePairを初期化する必要があるのは間違いではありません

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);

オブジェクトの初期化構文、つまり{Key = 1、Value = 2}を使用できない理由は、KeyプロパティとValueプロパティにはセッターのみゲッターがないためです(読み取り専用です)。だからあなたもすることはできません:

keyValuePair.Value = 1; // not allowed
51
Kevin Holditch

KeyValuePair<int, int>は構造体であり、幸いなことに不変構造体です。特に、これはそのプロパティが読み取り専用であることを意味します。そのため、それらにオブジェクト初期化子を使用することはできません。

14
Dennis

答えはわかりました。別の方法として、型推論の魔法のために、Tupleクラスに似たファクトリパターンを好みます:)

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Create<K, V>(K key, V value)
    {
        return new KeyValuePair<K, V>(key, value);
    }
}

したがって、shortは短くなります。

var keyValuePair = KeyValuePair.Create(1, 2);
10
nawfal

辞書にはコンパクトな初期化子があります:

var imgFormats = new Dictionary<string, ChartImageFormat>()
{
    {".bmp", ChartImageFormat.Bmp}, 
    {".gif", ChartImageFormat.Gif}, 
    {".jpg", ChartImageFormat.Jpeg}, 
    {".jpeg", ChartImageFormat.Jpeg}, 
    {".png", ChartImageFormat.Png}, 
    {".tiff", ChartImageFormat.Tiff}, 
};

この場合、ファイル拡張子をチャートオブジェクトの画像形式定数に関連付けるために使用した辞書i。

次のように、辞書から単一のkeyvaluepairを返すことができます。

var pair = imgFormats.First(p => p.Key == ".jpg");
9
flodis

KeyプロパティとValueプロパティにはセッターがありません。そのため、これらをイニシャライザで使用することはできません。コンストラクタを使用してください:)、あなたは大丈夫です。

5
Mihail Shishkov

ここに仕事をする例があります

KeyValuePair<int, int> kvp = new KeyValuePair<int, int>(1, 1);
2
Paulo Carvalho

Key および Value プロパティは読み取り専用であるため、オブジェクト初期化子では使用できません。

C#プログラミングガイド のこのエントリを参照してください。

1
Phil

あなたは何か間違ったことをしていません。 KeyValuePairsプロパティは読み取り専用です。それらを設定することはできません。また、空のデフォルトコンストラクタはありません。提供されているコンストラクタを使用する必要があります。

1
nvoigt