我知道这被问了很多次,我试图实现同样的.我有下面的清单
internal class GenList { public string Col1 { set; get; } public string Col2 { set; get; } } ListMainList = new List ();
我想将列表复制到其他列表中,如果在主列表中更改了某些内容,则不希望内容在克隆列表中更改.所以我想在下面做
Listcloned = MainList.ConvertAll(GenList => new GenList {});
我不知道在上面那些花括号内输入什么.
如果在主列表中更改了某些内容,则不希望内容在克隆列表中更改.
这听起来像你想要一个深刻的克隆,基本上.换句话说,创建一个新列表,其中每个元素是原始列表中元素的副本,而不仅仅是对原始列表引用的同一对象的引用.
在您的情况下,这很简单:
var cloned = MainList.ConvertAll(x => new GenList { Col1 = x.Col1, Col2 = x.Col2 });
或者使用LINQ:
var cloned = MainList.Select(x => new GenList { Col1 = x.Col1, Col2 = x.Col2 }) .ToList();
但请注意:
如果添加新属性,则需要更改此代码
如果添加可变类型的属性,则还需要克隆它
要考虑的选项:
添加一个DeepClone()
方法GenList
,将逻辑保持在一个地方,但许多地方需要它.
添加构造函数:GenList(GenList)
适当地复制
使用不可变类型(例如make GenList
immutable),此时集合的浅克隆就足够了.