Правильный способ копирования значений между списками в C #?

1

Допустим, у нас есть список 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. Это верно? Если да, то как мы можем создавать отдельные копии эффективно (в коде)?

  • 1
    Ваш вопрос отстает от правильного объяснения проблемы. Какой тип EmployeeList это класс или List <ListItem>
  • 0
    Спасибо @SaiKalyanKumarAkshinthala, это Список <Сотрудник>. Обновил вопрос
Теги:

2 ответа

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();
  • 0
    Нет необходимости реализовывать ICloneable , особенно потому, что его метод Clone возвращает object . Просто реализуйте метод Clone который возвращает Employee .
4

Просто используйте Linq для разработки новой коллекции (включая using System.Linq; если вы еще этого не сделали):

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

Так же, как и ваш new List<>/Add, это просто создает новый список, но к тем же ссылкам Employee что и в исходном EmployeeList. Если вам нужна глубокая копия содержащегося объекта, вы, как правило, используете метод, подобный циклу сериализации/десериализации, или используя отражение, рекурсивно, если у вас есть глубокий график под Employee.

  • 0
    Спасибо, Стюарт, я получил новую копию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню