Допустим, у нас есть список Employee (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. Это верно? Если да, то как мы можем создавать отдельные копии эффективно (в коде)?
Чтобы создать новый объект 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();
ICloneable
, особенно потому, что его метод Clone
возвращает object
. Просто реализуйте метод Clone
который возвращает Employee
.
Просто используйте Linq для разработки новой коллекции (включая using System.Linq;
если вы еще этого не сделали):
var newEmployeeList = EmployeeList
.Where(e => e.YearsWorked < 2)
.ToList()
Так же, как и ваш new List<>/Add
, это просто создает новый список, но к тем же ссылкам Employee
что и в исходном EmployeeList
. Если вам нужна глубокая копия содержащегося объекта, вы, как правило, используете метод, подобный циклу сериализации/десериализации, или используя отражение, рекурсивно, если у вас есть глубокий график под Employee
.