是否有一种更简单的方法来初始化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"}
};

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

编辑:事实证明。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)。