32

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

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

有没有办法简洁地做到这一点?

4

3 回答 3

43

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

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

这通过使用List<T>接受 a 的构造函数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 等需要)。

于 2012-11-06T18:14:30.957 回答
11

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

List<MyObject> newList = new[] { object1 }.Concat(listOfObjects).ToList();
于 2012-11-06T18:12:19.557 回答
3

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

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

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

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

可以在 C# Programming Guide about Object and Collection Initializers中找到一些解释(我找不到更好的词):

集合初始化器允许您在初始化实现 IEnumerable 并具有 Add 的集合类型时指定一个或多个元素初始化器作为实例方法或扩展方法。

于 2020-08-12T10:27:17.293 回答