是否有一种更简单的方法来初始化List <keyvaluepair <t,u =“”>&gt;,如字典<t,u =“”>?</t,> </keyvaluepair <t,>

时间:2011-09-12 12:29:54

标签: c# .net

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

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

3 个答案:

答案 0 :(得分:9)

编辑:事实证明.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"}
};

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

您键入的代码工作得很好 - 进一步向Mads Togersen的post关于集合初始化程序的实现,编译器将大括号分隔的条目(上面的{"key1", "value1"})映射到集合上的Add方法具有相同的签名 - 在这种情况下Dictionary.Add(TKey, TValue)