我今天被问到这个问题:
如何将项目添加到列表并返回该列表?
List<T>.Add(T)
的代码返回void。所以你不能做这样的事情:
var list = new List<string>{"item1","item2"};
var newList = list.Add("item3");
这与使用AutoMapper有关,尽管该部分并不是特别重要。
答案 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");