关于c#:如何以正确的方式初始化KeyValuePair对象?

How to initialize KeyValuePair object the proper way?

我在(和其他人一样)这个问题中看到,人们想知道如何初始化keyValuePair的实例,它预期应该是这样的。

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

它不起作用,好像属性不在那里。intead,我需要使用这样的构造函数。

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

不可否认,更短的语法,但我不能使用初始值设定项,这让我很困扰。我做错什么了?


您没有错,必须使用

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

不能使用对象初始化语法ie key=1,value=2的原因是key和value属性没有setter-only getter(它们是只读的)。所以你甚至不能这样做:

1
keyValuePair.Value = 1; // not allowed

KeyValuePair是一个结构,幸运的是,它是不变的结构。特别是,这意味着它的属性是只读的。所以,你不能为他们使用对象初始化器。


好的,你知道答案了。作为替代方案,我更喜欢类似于Tuple类的工厂模式,用于类型推理魔术:)

1
2
3
4
5
6
7
public static class KeyValuePair
{
    public static KeyValuePair<K, V> Create<K, V>(K key, V value)
    {
        return new KeyValuePair<K, V>(key, value);
    }
}

所以变短了:

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

字典具有压缩初始值设定项:

1
2
3
4
5
6
7
8
9
var imgFormats = new Dictionary<string, ChartImageFormat>()
{
    {".bmp", ChartImageFormat.Bmp},
    {".gif", ChartImageFormat.Gif},
    {".jpg", ChartImageFormat.Jpeg},
    {".jpeg", ChartImageFormat.Jpeg},
    {".png", ChartImageFormat.Png},
    {".tiff", ChartImageFormat.Tiff},
};

在本例中,我使用的字典将文件扩展名与图表对象的图像格式常量相关联。

单个keyValuePair可以从字典中返回,如下所示:

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

键和值属性没有setter。这就是为什么你不能在初始值设定项中使用它们。只需使用构造函数:)就可以了。


下面举一个例子来做这个工作

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


你没有做错什么。KeyValuePairs属性是只读的。你不能设置它们。此外,没有空的默认构造函数。您需要使用提供的构造函数。


键和值属性是只读的,因此不能在对象初始值设定项中使用它们。

请参见C编程指南中的此条目。