如何将对象初始值设定项用于键值对列表?

问题描述 投票:0回答:5

我无法弄清楚进行内联集合初始化的语法:

var a = new List<KeyValuePair<string, string>>();
c# key-value
5个回答
94
投票

请注意,字典集合初始化

{ { key1, value1 }, { key2, value2 } }
取决于字典的
Add(TKey, TValue)
方法。您不能将此语法与列表一起使用,因为它缺少该方法,但您可以使用该方法创建一个子类:

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

public class Program
{
    public static void Main()
    {
        var list = new KeyValueList<string, string>
                   {
                       { "key1", "value1" },
                       { "key2", "value2" },
                       { "key3", "value3" },
                   };
    }
}

91
投票

非常简单:

var a = new List<KeyValuePair<string, string>>()
{
    new KeyValuePair<string, string>("A","B"),
    new KeyValuePair<string, string>("A","B"),
    new KeyValuePair<string, string>("A","B"),
};

请注意,您可以在最后一个元素后面保留尾随逗号(可能是因为 .net 创建者希望使自动代码生成更容易),或者删除列表构造函数的

()
括号,代码仍然可以编译。


15
投票

另一种不需要创建子类的替代方案:

List<KeyValuePair<String, String>> list = new Dictionary<String, String>
    {
        {"key1", "value1"},
        {"key2", "value2"},
    }.ToList();

正如评论中提到的:此方法的缺点包括可能丢失顺序和无法添加重复键。


10
投票

由于这里没有提到集合初始值设定项(C# 6.0):

实施

public static class InitializerExtensions
{
   public static void Add<T1, T2>(this ICollection<KeyValuePair<T1, T2>> target, T1 item1, T2 item2)
   {
       if (target == null)
            throw new ArgumentNullException(nameof(target));

        target.Add(new KeyValuePair<T1, T2>(item1, item2));
    }
}

用法

var list = new List<KeyValuePair<string, string>> { {"ele1item1", "ele1item2"}, { "ele2item1", "ele2item2" } };

如何让它发挥作用

只需在文件中包含正确的

using
语句,以便
InitializerExtensions
可用(这意味着您可以显式调用
InitializerExtensions.Add
),并且如果您使用 VS 2015 或更高版本,特殊集合初始值设定项语法将可用。


-1
投票

任何初始化都是通过

object(params_if_exist) { any public member or instance};

完成的

f.e.

var list = new List<int> {1,2,3};

var bw = new BackgroundWorker() {WorkerSupportsCancellation = true};

© www.soinside.com 2019 - 2024. All rights reserved.