46 c# initialization
我已经在(其中包括)这个问题中看到人们想知道如何初始化KeyValuePair的实例,预计应该看起来像这样.
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{
Key = 1,
Value = 2
};
Run Code Online (Sandbox Code Playgroud)
它不起作用,好像属性不存在.Intead,我需要像这样使用构造函数.
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
Run Code Online (Sandbox Code Playgroud)
不可否认,语法较短,但我不能使用初始化程序.我究竟做错了什么?
Kev*_*tch 53
你没有错,你必须初始化keyValuePair使用
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
Run Code Online (Sandbox Code Playgroud)
你不能使用对象初始化语法即{Key = 1,Value = 2}的原因是Key和Value属性没有setter only getter(它们只读).所以你甚至不能这样做:
keyValuePair.Value = 1; // not allowed
Run Code Online (Sandbox Code Playgroud)
Den*_*nis 14
KeyValuePair<int, int>是一个结构,幸运的是,它是不可变的结构.特别是,这意味着它的属性是只读的.因此,您无法使用对象初始化程序.
naw*_*fal 10
好的,你有答案.作为替代方案,我更喜欢类似于Tuple类的工厂模式,用于类型推理魔术:)
public static class KeyValuePair
{
public static KeyValuePair<K, V> Create<K, V>(K key, V value)
{
return new KeyValuePair<K, V>(key, value);
}
}
Run Code Online (Sandbox Code Playgroud)
如此短暂变短:
var keyValuePair = KeyValuePair.Create(1, 2);
Run Code Online (Sandbox Code Playgroud)
字典具有紧凑的初始化器:
var imgFormats = new Dictionary<string, ChartImageFormat>()
{
{".bmp", ChartImageFormat.Bmp},
{".gif", ChartImageFormat.Gif},
{".jpg", ChartImageFormat.Jpeg},
{".jpeg", ChartImageFormat.Jpeg},
{".png", ChartImageFormat.Png},
{".tiff", ChartImageFormat.Tiff},
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我用来将文件扩展名与图表对象的图像格式常量相关联.
可以从字典中返回单个keyvaluepair,如下所示:
var pair = imgFormats.First(p => p.Key == ".jpg");
Run Code Online (Sandbox Code Playgroud)
小智 7
这是一个可以完成工作的示例
KeyValuePair<int, int> kvp = new KeyValuePair<int, int>(1, 1);
Run Code Online (Sandbox Code Playgroud)