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