是否有一种更简单的方法来初始化List>,就像Dictionary
本文关键字:List Dictionary KeyValuePair 就像 初始化 一种 方法 更简单 是否 | 更新日期: 2023-09-27 18:08:14
实际上我需要像List<KeyValuePair<T, U>>
这样的东西,但我希望能够像字典一样初始化它(即每次不写new KeyValuePair
)。这样的:
Dictionary<string, string> dic = new Dictionary<string, string>
{
{ "key1", "value1"},
{ "key2", "value2"}
};
编辑:事实证明。net 确实已经有一个组合列表/字典类型:OrderedDictionary
。不幸的是,这是一种非通用类型,在我看来,这使得它不那么有吸引力。但是,如果只是重复调用Add
,则保留插入顺序。
Add
并不影响键已经存在的条目,而使用索引器添加键/值对将覆盖先前的关联。基本上它看起来不像是一个非常好的API,我个人仍然会避免使用它,除非你的用例完全符合的行为。不,. net没有任何保持插入顺序的字典。您总是可以使用相关的Add
方法编写自己的基于列表的类型。这甚至可能是我考虑扩展现有类型的少数几个地方之一:
public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>>
{
public void Add(TKey key, TValue value)
{
Add(new KeyValuePair<TKey, TValue>(key, value));
}
}
:
var list = new KeyValueList<string, string>
{
{ "key1", "value1"},
{ "key2", "value2"}
};
另一种选择是使用组合,但我的直觉认为这是继承的合理使用。我不知道为什么在这种情况下我很高兴,但通常不是这样,提醒你…
因为没有字典,所以不能使用字典初始化器。你有一个列表,所以你可以使用列表初始化器这将是最接近的:
var l = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("key1", "value1"),
new KeyValuePair<string, string>("key2", "value2"),
};
这是你使用字典初始化器的最低要求:类必须实现IEnumerable
,类必须有一个接受2个参数的公共方法Add
(其中第一个参数代表键,第二个参数代表值)。因此,您可以编写一个满足这些要求的自定义类,并且您将能够使用您在问题中显示的语法。
您键入的代码工作得很好-进一步到Mads Togersen关于集合初始化器实现的帖子,编译器将大括号分隔的条目(上面的{"key1", "value1"}
)映射到具有相同签名的集合上的Add方法-在本例中是Dictionary。Add (TKey TValue)。