在 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。这是对的吗?如果是,那么我们如何有效地(在代码中(创建单独的副本?

在 C# 中的列表之间复制值的正确方法

只需使用 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();
相关文章: