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

时间:2014-12-18 03:58:41

标签: c#

假设我们有一个Employee列表(List<Employee> EmployeeList),其中每个员工都有Name(字符串)。 如果我们要获得一份新的员工姓名列表,那么正在做以下正确/最佳实践吗?

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

2 个答案:

答案 0 :(得分:4)

只需使用Linq投影新集合(如果您还没有这样做,请包含using System.Linq;):

var newEmployeeList = EmployeeList
            .Where(e => e.YearsWorked < 2)
            .ToList()

就像您的手册new List<> / Add一样,这只会创建一个新列表,但与原始Employee中的EmployeeList引用相同。如果你想要一个包含实体的深层副本,你通常会使用technique like一个序列化/反序列化循环,或者如果你在Employee下面有一个深图,则递归地使用反射。

答案 1 :(得分:3)

要创建Employee的新对象,您应该在ICloneable类上实现Employee界面。然后,您可以使用:

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();