如何将项目添加到列表并返回新列表

本文关键字:列表 新列表 返回 项目 添加 | 更新日期: 2023-09-27 18:24:12

我今天被问到这个问题:

如何将项目添加到列表并返回该列表?

List<T>.Add(T)的代码返回 void。 所以你不能做这样的事情:

var list = new List<string>{"item1","item2"};
var newList = list.Add("item3");

这与使用AutoMapper有关,尽管该部分不是特别重要。

如何将项目添加到列表并返回新列表

一个选项是 Linq,带有 Concat

var list = new List<string>{"item1", "item2"};
var newList = list.Concat(new[] { "item3" }).ToList();

在典型的 Linq 方式中,list保持不变,newList包含list中的所有项目以及新列表中的项目,在本例中仅为 "item3"

如果符合您的使用案例,您可以跳过.ToList()以保留IEnumerable<string>结果。


如果您发现自己经常对单个项目执行此操作,则可以使用以下扩展方法传递它们,而无需new[] { ... }语法:

public static IEnumerable<T> ConcatItems<T>(this IEnumerable<T> source, params T[] items)
{
    return source.Concat(items);
}

由于数组params,前面的示例变为:

var list = new List<string>{"item1", "item2"};
var newList = list.ConcatItems("item3").ToList();

确保不要将其与 Union 混淆,这会删除重复的项目。(搜索这些重复项是您可能不想要的开销!

这个问题的答案相对简单:

var list = new List<string>(new List<string>{"item1","item2"}){"item3"};

List<T>()有一个可以接受IEnumerable<T>的构造函数 (MSDN(。 此外,还可以使用对象资源库将新项放入列表中。

因此,对于一个更复杂的示例:

var originalList = new List<string>();
originalList.Add("item1");
originalList.Add("item2");
var newList = new List<string>(originalList){"item3"};

你可以简单地做:

List<string> list = new List<string>{"item1","item2"};
List<string> newList = null;
(newList = list.ToList()).Add("item3");

或者创建自己的扩展方法:

public static class Helper 
{
   public static List<T> MyAdd<T>(this List<T> collection, T item)
   {
      collection.Add(item);
      return collection;
   }
}

并使用它:

List<string> list = new List<string>{"item1","item2"};
List<string> newList = list.MyAdd("item3"); // same object though
List<string> newList2 = newList.ToList().MyAdd("item4").MyAdd("item5"); // different object 
ImmutableList<T>(

以及来自System.Collections.Immutable的其他类似数据结构(的一个属性是它不会改变原始列表,它返回另一个具有附加值的不可变列表。

所以这样做:

var originalImmutable = ImmutableList<int>.Create(1, 2);
var otherImmutable = originalImmutable.Add(3);

每次调用 Add 时,都会导致一个浅拷贝的新列表。

最易读和可维护的解决方案是复制列表,然后添加项目:

var list = new List<string>{"item1","item2"};
var newList = list.toList();
newList.Add("item3");

自从提出这个问题以来已经过去了七年,但 Enumerable 类现在提供了可以以简单方式使用的 Prepend 和 Append 方法:

var list = new List<string>{"item1","item2"};
var newList = list.Append("item3").ToList();