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

C# 如何将项目添加到列表并返回新列表,c#,C#,今天有人问我这个问题: 如何将项目添加到列表并返回该列表 List.Add(T)的代码返回void。所以你不能这样做: var list = new List<string>{"item1","item2"}; var newList = list.Add("item3"); var list=新列表{“item1”、“item2”}; var newList=list.Add(“item3”); 这与使用AutoMapper有关,尽管这一部分并不特别重要。这个问题的答案相对简单

今天有人问我这个问题:

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

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

var list = new List<string>{"item1","item2"};
var newList = list.Add("item3");
var list=新列表{“item1”、“item2”};
var newList=list.Add(“item3”);

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

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

var list = new List<string>(new List<string>{"item1","item2"}){"item3"};
var list=新列表(新列表{“item1”、“item2”}){“item3”};
List()
有一个构造函数,可以接受
IEnumerable
()。此外,还可以使用对象设置器将新项放入列表中

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

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

var newList = new List<string>(originalList){"item3"};
var originalList=new List();
原始列表添加(“项目1”);
原始列表添加(“第2项”);
var newList=新列表(原始列表){“item3”};
您只需执行以下操作:

List<string> list = new List<string>{"item1","item2"};
List<string> newList = null;

(newList = list.ToList()).Add("item3");
List List=新列表{“item1”、“item2”};
List 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;
   }
}
公共静态类帮助器
{
公共静态列表MyAdd(此列表集合,T项)
{
集合。添加(项目);
回收;
}
}
并使用它:

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 
List List=新列表{“item1”、“item2”};
List newList=List.MyAdd(“item3”);//不过还是一样的
List newList2=newList.ToList().MyAdd(“item4”).MyAdd(“item5”);//不同对象
一个选项是Linq,具有:

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

var list = new List<string>{"item1", "item2"};
var newList = list.ConcatItems("item3").ToList();
var list=新列表{“item1”、“item2”};
var newList=list.ConcatItems(“item3”).ToList();

确保不要将其与删除重复项的操作混淆。(搜索这些重复项的开销可能是您不希望的!)

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

这样做:

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

每次调用
Add

时,都会产生一个浅层复制的新列表。最具可读性和可维护性的解决方案是复制列表,然后添加项目:

var list = new List<string>{"item1","item2"};
var newList = list.toList();
newList.Add("item3");
var list=新列表{“item1”、“item2”};
var newList=list.toList();
新增清单。添加(“第3项”);

为什么要创建新列表?为什么不添加到列表中并继续引用原始版本?我认为问题在于AutoMaper,而不是创建自定义解析器,您可以在一行中完成:
FormMember(t=>t.Items,options=>options.MapFrom(s=>new list(t.Items).add(s.Item));
t。Items是对象中的现有列表,可能包含现有数据,但是,我们只想从源中附加值。不幸的是,这一行要求您返回一个值,以便Automapper可以将其设置为属性。我不完全理解这如何回答您文章中的第一条语句(我如何向列表中添加一个项目并返回该列表?)。这会创建一个新的列表,似乎毫无意义。特别是因为该语句要求“返回该列表”,而我假设该列表就是您添加到的列表。还是我误解了该语句?@DangerZone我将在我的问题中澄清“返回该列表”的语句引用的项目列表不一定是相同的引用。这是最简洁的语法回答。在初始化过程中使用构造函数和setter完美地解决了问题!我真的很喜欢这一个,我没有想到
Concat
函数!我收回了我在回答中所说的。这同样可读性和更高e简明。+1我认为这个答案最重要的方面是,
List
ImmutableList
对于不同操作的性能是非常不同的,虽然有一些情况下
List
更快,但这是一个
ImmutableList
更快的情况,特别是当第一个列表更大时E
var originalImmutable = ImmutableList<int>.Create(1, 2);
var otherImmutable = originalImmutable.Add(3);
var list = new List<string>{"item1","item2"};
var newList = list.toList();
newList.Add("item3");