在 C# 中的列表之间复制值的正确方法
本文关键字:方法 复制 之间 列表 | 更新日期: 2023-09-27 18:34:29
假设我们有一个员工列表(List<Employee> EmployeeList
(,其中每个雇员都有姓名(字符串(。如果我们要有一个只包含员工姓名的新列表,是否正在做以下正确/最佳实践?
List<string> NameList = new List<string>();
foreach( Employee e in EmployeeList)
{
NameList.Add(e.Name);
}
如果我们处理的不是字符串,而是复杂类型,例如将员工列表从一个列表复制到另一个列表,例如:
List<Employee> newEmployeeList = new List<Employee>();
foreach( Employee e in EmployeeList)
{
if (Employee.YearsWorked<2)
newEmployeeList.Add(e);
}
newEmployeeList 不会将 Employee 实例的单独副本复制到 EmployeeList。这是对的吗?如果是,那么我们如何有效地(在代码中(创建单独的副本?
只需使用 Linq 投影新集合(如果尚未投影,请包含using System.Linq;
(:
var newEmployeeList = EmployeeList
.Where(e => e.YearsWorked < 2)
.ToList()
就像您的手动new List<> / Add
一样,这只是创建一个新列表,但引用与原始EmployeeList
中的Employee
相同。如果您想要所包含实体的深层副本,您通常会使用序列化/反序列化循环之类的技术,或者如果您Employee
下有一个深度图,则递归使用反射。
要创建一个Employee
的新对象,你应该在Employee
类上实现ICloneable
接口。然后,您可以使用以下任一方法:
List<Employee> newEmployeeList = new List<Employee>();
foreach( Employee e in EmployeeList)
{
if (e.YearsWorked<2)
newEmployeeList.Add(e.Clone());
}
或:
var newEmployeeList = (from e in EmployeeList where e.YearsWorked < 2 select e.Clone()).ToList();