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

时间:2015-11-24 15:50:35

标签: c#

我今天被问到这个问题:

  

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

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

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

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

5 个答案:

答案 0 :(得分:16)

一个选项是Linq,Concat

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

以典型的Linq方式,list保持不变,newList包含list中的所有项目以及新列表中的项目,在这种情况下仅{{1} }}

如果符合您的使用案例,您可以跳过"item3"以保留.ToList()结果。

如果您发现自己经常使用单个项目,可以使用类似此扩展方法的内容来传递它们而不使用IEnumerable<string>语法:

new[] { ... }

由于public static IEnumerable<T> ConcatItems<T>(this IEnumerable<T> source, params T[] items) { return source.Concat(items); } 数组,前面的示例变为:

params

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

您可以这样做:

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 

答案 3 :(得分:2)

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

这样做:

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

每次调用Add时,都会导致复制的新列表变浅。

答案 4 :(得分:0)

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

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