Как правильно инициализировать объект 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);
По правде говоря, более короткий синтаксис, но меня беспокоит, что я не могу использовать инициализатор. Что я делаю неправильно?
Ответы
Ответ 1
Вы не ошибаетесь, вам нужно инициализировать keyValuePair, используя
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
Причина, по которой вы не можете использовать синтаксис инициализации объекта, т.е. {Key = 1, Value = 2}, состоит в том, что свойства Key и Value не имеют сеттеров только для getters (они только для чтения). Поэтому вы даже не можете делать:
keyValuePair.Value = 1; // not allowed
Ответ 2
KeyValuePair<int, int>
является структурой и, к счастью, является неизменной структурой. В частности, это означает, что его свойства читаются только. Таким образом, вы не можете использовать объект intializer для них.
Ответ 3
Хорошо, у вас есть ответы. В качестве альтернативы я предпочитаю шаблон factory, похожий на класс Tuple
, для магии ввода типа:)
public static class KeyValuePair
{
public static KeyValuePair<K, V> Create<K, V>(K key, V value)
{
return new KeyValuePair<K, V>(key, value);
}
}
Таким образом, короткий становится короче:
var keyValuePair = KeyValuePair.Create(1, 2);
Ответ 4
У свойств Key и Value нет сеттеров. Вот почему вы не можете использовать их в инициализаторе. Просто используйте конструктор:), и все будет хорошо.
Ответ 5
Вот пример, который выполняет задание
KeyValuePair<int, int> kvp = new KeyValuePair<int, int>(1, 1);
Ответ 6
Key и Значение свойства доступны только для чтения, поэтому вы не можете использовать их в инициализаторе объекта.
См. эту запись в руководстве по программированию на С#.
Ответ 7
Вы не делаете что-то не так. Свойства KeyValuePairs доступны только для чтения. Вы не можете установить их. Кроме того, пустого конструктора по умолчанию нет. Вам нужно использовать предоставленный конструктор.
Ответ 8
Словари имеют компактные инициализаторы:
var imgFormats = new Dictionary<string, ChartImageFormat>()
{
{".bmp", ChartImageFormat.Bmp},
{".gif", ChartImageFormat.Gif},
{".jpg", ChartImageFormat.Jpeg},
{".jpeg", ChartImageFormat.Jpeg},
{".png", ChartImageFormat.Png},
{".tiff", ChartImageFormat.Tiff},
};
В этом случае словарь я использовал для связывания расширений файлов с константами формата изображения объектов диаграммы.
В словаре может быть возвращена одна ключевая пара, как это:
var pair = imgFormats.First(p => p.Key == ".jpg");