(とりわけ) この質問 で、人々はKeyValuePairのインスタンスを初期化する方法を疑問に思っています。こんな風に見える。
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{
Key = 1,
Value = 2
};
プロパティが存在しないかのように機能しません。 Intead、私はこのようなコンストラクタを使用する必要があります。
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
確かに短い構文ですが、イニシャライザを使用できないのは気になります。私は何を間違えていますか?
を使用してkeyValuePairを初期化する必要があるのは間違いではありません
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
オブジェクトの初期化構文、つまり{Key = 1、Value = 2}を使用できない理由は、KeyプロパティとValueプロパティにはセッターのみゲッターがないためです(読み取り専用です)。だからあなたもすることはできません:
keyValuePair.Value = 1; // not allowed
KeyValuePair<int, int>
は構造体であり、幸いなことに不変構造体です。特に、これはそのプロパティが読み取り専用であることを意味します。そのため、それらにオブジェクト初期化子を使用することはできません。
答えはわかりました。別の方法として、型推論の魔法のために、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);
辞書にはコンパクトな初期化子があります:
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");
KeyプロパティとValueプロパティにはセッターがありません。そのため、これらをイニシャライザで使用することはできません。コンストラクタを使用してください:)、あなたは大丈夫です。
ここに仕事をする例があります
KeyValuePair<int, int> kvp = new KeyValuePair<int, int>(1, 1);
Key および Value プロパティは読み取り専用であるため、オブジェクト初期化子では使用できません。
C#プログラミングガイド のこのエントリを参照してください。
あなたは何か間違ったことをしていません。 KeyValuePairsプロパティは読み取り専用です。それらを設定することはできません。また、空のデフォルトコンストラクタはありません。提供されているコンストラクタを使用する必要があります。