使用单个对象和另一个对象列表初始化列表

时间:2012-11-06 18:08:51

标签: c# collections collection-initializer

我想使用对象和特定顺序的对象列表初始化列表。目前,我正在做:

List<MyObject> list = new List<MyObject>();
list.Add(object1); // object1 is type MyObject
list.AddRange(listOfObjects); // listOfObjects is type List<MyObject>

我希望将其合并到初始化语句中(当然语法错误):

List<MyObject> newList = new List<MyObject>() { object1, listOfObjects };

有没有办法简明扼要地做到这一点?

3 个答案:

答案 0 :(得分:26)

如果元素的顺序不重要,您可以使用:

List<MyObject> newList = new List<MyObject>(listOfObjects) { object1 };

这可以通过使用接受List<T>的{​​{1}}构造函数,然后使用集合初始值设定项来添加其他项目。例如,以下内容:

IEnumerable<T>

将打印:

static void Main()
{
    int test = 2;
    List<int> test2 = new List<int>() { 3, 4, 5 };
    List<int> test3 = new List<int>(test2) { test };

    foreach (var t in test3) Console.WriteLine(t);

    Console.ReadKey();
}

请注意,订单与原始订单不同,因为单个商品已添加 last

但是,如果订单很重要,我个人只需构建列表,将第一个对象放入初始化程序中,然后调用3 4 5 2

AddRange

这使得意图非常明确,并避免构建临时项目(使用LINQ的Concat等需要)。

答案 1 :(得分:8)

我认为你能做的最好的事情是:

List<MyObject> newList = new[] { object1 }.Concat(listOfObjects).ToList();

答案 2 :(得分:1)

这可以借助扩展方法来实现,例如

public static class CollectionExtensions
{
    public static void Add<T>(this ICollection<T> collection, IEnumerable<T> itemsToAdd)
    {
        foreach (var item in itemsToAdd)
        {
            collection.Add(item);
        }
    }
}

用法与问题中所建议的完全相同

List<MyObject> newList = new List<MyObject>() { object1, listOfObjects };

可以在C#编程指南中找到有关Object and Collection Initializers的一些解释(我找不到更好的词):

集合初始值设定项可让您指定一个或多个元素 初始化实现的集合类型时的初始值设定项 IEnumerable并具有带有适当签名的Add作为实例 方法或扩展方法。