我正在尝试使用AddRange或其他方式将列表复制到另一个列表,但似乎没有任何工作正常。无论我尝试的是什么方式,我都会修改复制的列表,它也会修改原始列表。如果我使用foreach循环复制它的唯一方法。
static void Main(string[] args)
{
var test = new List<Employee>{ new Employee { ID = "101", Name ="ABC1"}, new Employee{ID = "102", Name = "ABC2"}, new Employee{ ID = "103", Name = "ABC3"}};
var tets2 = new List<Employee>(test);
tets2[0].ID = "1-73";
TestMethod(test.ToList());
}
private static void TestMethod(List<Employee> test)
{
var test1 = new List<Employee>(test);
test1.AddRange(test);
//This is the only one that work
foreach(var item in test)
{
var x = new Employee { ID = item.ID, Name = item.Name };
test1.Add(x);
}
test1[0].ID = "104";
}
有没有更短的方法呢?
答案 0 :(得分:3)
它没有修改列表 - 它正在修改列表中的项目。
您可以有两个或更多列表 - 每个列表都是List<Employee>
- 如果将项目复制到另一个列表或数组,则两个列表中的项目都是相同的项目。
var x = new Employee { ID = "xyz", Name = "Bob" };
var list = new List<Employee>();
list.Add(x);
var array = new Employee[]{x};
var y = x;
y.ID = "abc";
在此示例中,Employee
只有一个实例,但有四个引用到该Employee
。
x
是一个参考list[0]
是另一个array[0]
y
但是,您引用的是一个实例,包括list[0].ID = "new id"
它是Employee
的所有相同实例。
要创建副本,你可以做类似的事情 - 这是一个冗长的例子,不一定是你想要实际实现它的方式:
var newList = new List<Employee>();
foreach(var employee in sourceList) //the list you want to copy from
{
newList.Add(new Employee{ID=employee.ID, Name=employee.Name});
}
添加到newList
的项目与sourceList
中的相同对象不同。它们是具有相同属性的新对象。
如果您预见到需要经常这样做,那么您可以Employee
实施ICloneable
。
public class Employee : ICloneable
{
public string ID {get;set;}
public string Name {get;set;}
public object Clone()
{
return new Employee{ID=ID, Name=Name};
}
}
或者,因为属性只是值类型,所以您可以这样做,它将源对象中的属性复制到新对象中。
public class Employee : ICloneable
{
public string ID {get;set;}
public string Name {get;set;}
public object Clone()
{
return this.MemberwiseClone();
}
}
然后,要创建新列表,您可以创建一个扩展方法:
public static class EmployeeExtensions
{
public static List<Employee> ToClonedList(this IEnumerable<Employee> source)
{
return source.Select(employee => employee.Clone() as Employee).ToList();
}
}
然后,您可以从任何IEnumerable
员工组创建克隆列表,如下所示:
var myClonedList = oldList.ToClonedList();
(为了分裂头发,你不必实现ICloneable
。你可以写一个复制对象的方法。ICloneable
只是一个允许其他人知道他们可以调用的约定.Clone()
并创建一个克隆对象。)