Инициализировать список как с одним объектом, так и с другим списком объектов

Я хочу инициализировать список с объектом и списком объектов в этом определенном порядке. В настоящее время я делаю:

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 };

есть ли способ сделать это лаконично?

2 ответов


если порядок элементов не важен, можно использовать:

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

это работает с помощью List<T> конструктор, который принимает 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();
}

выведет:

3
4
5
2

обратите внимание, что заказ отличается от вашего оригинала, однако, как отдельный элемент добавляется последние.

если заказ важен, однако, я бы лично просто создайте список, поместив в свой первый объект в инициализаторе и вызвав AddRange:

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

это делает намерение очень ясным и позволяет избежать создания временных элементов (которые потребуются с использованием Linq Concat и т. д.).


Я думаю, лучшее, что вы можете сделать, это:

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