是否有一种更简单的方法来初始化List <KeyValuePair >,就像Dictionary ?

实际上我需要像List<KeyValuePair>这样的东西List<KeyValuePair>但我希望能够像字典一样初始化它(即每次new KeyValuePairnew KeyValuePair )。 像这样:

 Dictionary dic = new Dictionary { { "key1", "value1"}, { "key2", "value2"} }; 

编辑:事实certificate.NET 确实已经有一个组合列表/字典类型: OrderedDictionary 。 不幸的是,这是一种非generics类型,在我看来它的吸引力相当小。 但是,如果您只是重复调用Add ,它会保留插入顺序。

这有点奇怪,因为调用Add不会影响密钥已存在的条目,而使用索引器添加键/值对将覆盖先前的关联。 基本上它似乎不是一个非常好的API,我个人仍然会避免它,除非你的用例完全匹配其行为。


不,.NET没有任何插入顺序保留字典。 您始终可以使用相关的Add方法编写自己的基于列表的类型。 这甚至可能是我考虑扩展现有类型的少数几个地方之一:

 public class KeyValueList : List> { public void Add(TKey key, TValue value) { Add(new KeyValuePair(key, value)); } } 

然后:

 var list = new KeyValueList { { "key1", "value1"}, { "key2", "value2"} }; 

另一种方法是使用组合,但我的直觉是这是合理使用inheritance。 我不能说为什么我在这种情况下很开心,但通常不会,请注意……

因为您没有字典,所以无法使用字典initiailzer。 你有一个列表,所以你可以使用一个列表初始化器,它将是你可以得到的最接近的:

 var l = new List> { new KeyValuePair("key1", "value1"), new KeyValuePair("key2", "value2"), }; 

这是您使用字典初始值设定项的最低要求:该类必须实现IEnumerable ,并且该类必须具有公共方法Add ,它接受2个参数(其中第一个参数表示键,第二个参数表示值)。 因此,您可以编写满足这些要求的自定义类,并且您将能够使用您在问题中显示的语法。

您键入的代码工作得很好 – 进一步到Mads Togersen关于集合初始化器的实现的post ,编译器将大括号分隔的条目(上面的{"key1", "value1"} )映射到集合上的Add方法签名 – 在本例中为Dictionary.Add(TKey,TValue) 。