C# 填写清单<;T>;使用IEnumerable<;T>;使用LINQ投影新类型时

C# 填写清单<;T>;使用IEnumerable<;T>;使用LINQ投影新类型时,c#,linq,C#,Linq,下面是我的示例代码: let departmentResult = // Where clause could go here... .Select(department => new Department() { Name = department["Name"].ToString(), // How can I fill Employees collection rather than replace it with a new list? Employees =

下面是我的示例代码:

let departmentResult = 
// Where clause could go here...
.Select(department => new Department()
{
   Name = department["Name"].ToString(),
   // How can I fill Employees collection rather than replace it with a new list?
   Employees = new List<Employee>(employeesResult)
}
).FirstOrDefault()
让部门结果=
//Where子句可以放在这里。。。
.选择(部门=>新部门()
{
名称=部门[“名称”]。ToString(),
//我如何填写员工集合而不是用新列表替换它?
员工=新列表(员工结果)
}
).FirstOrDefault()
在本例中,我使用LINQ投影一个新的Department类。部门有一个Employees(员工列表)集合,我通过向其传递单独的LINQ查询结果(employeesResult)来分配该集合

这种方法的问题是部门的构造函数将事件处理程序分配给其Employees集合。通过向员工分配新的员工列表,而不是迭代地向员工添加员工对象,它“清除”了我的事件处理程序,因为新列表没有分配任何事件处理程序。我可以在Employees'setter中重新添加事件处理程序,但现在我必须在两个位置添加事件处理程序

有没有办法做到这一点:

let departmentResult = 
// Where clause goes here
.Select(department => new Department()
{
Name = department["Name"].ToString(),
// Possible solution: Subclass List<T> and add an AddMany method? This throws an error, though. 
// Error: Employees not found.
Employees.AddMany(employeesResult)
}
).FirstOrDefault()
让部门结果=
//Where子句在这里
.选择(部门=>新部门()
{
名称=部门[“名称”]。ToString(),
//可能的解决方案:子类List并添加AddMany方法?但这会引发一个错误。
//错误:找不到员工。
Employees.AddMany(employeesResult)
}
).FirstOrDefault()
是,使用AddRange

let departmentResult = 
// Where clause goes here
.Select(department => 
{
   var x = new Department()
    {
        Name = department["Name"].ToString(),
        Employees = department.Employees
    }

   x.Employees.AddRange(employeesResult);
   return x;
}).FirstOrDefault()
是的,使用AddRange

let departmentResult = 
// Where clause goes here
.Select(department => 
{
   var x = new Department()
    {
        Name = department["Name"].ToString(),
        Employees = department.Employees
    }

   x.Employees.AddRange(employeesResult);
   return x;
}).FirstOrDefault()
是的,使用AddRange

let departmentResult = 
// Where clause goes here
.Select(department => 
{
   var x = new Department()
    {
        Name = department["Name"].ToString(),
        Employees = department.Employees
    }

   x.Employees.AddRange(employeesResult);
   return x;
}).FirstOrDefault()
是的,使用AddRange

let departmentResult = 
// Where clause goes here
.Select(department => 
{
   var x = new Department()
    {
        Name = department["Name"].ToString(),
        Employees = department.Employees
    }

   x.Employees.AddRange(employeesResult);
   return x;
}).FirstOrDefault()

如果可以,请添加构造函数参数。毕竟,如果构造函数已经在创建一个空列表并附加一个事件处理程序,那么它也应该能够创建一个填充列表

.Select(department => new Department(department["Name"].ToString(), employeesResult))
如果您不能添加构造函数参数,那么只需定义一个工厂方法

.Select(department => CreateDepartment(department["Name"].ToString(), employeesResult))

...

static Department CreateDepartment(string name, IEnumerable<Employee> employees)
{
  var department = new Department()
  {
    Name = name
  };

  foreach (var employee in employees)
  {
    department.Employees.Add(employee);
  }

  return department;
}

如果可以,请添加构造函数参数。毕竟,如果构造函数已经在创建一个空列表并附加一个事件处理程序,那么它也应该能够创建一个填充列表

.Select(department => new Department(department["Name"].ToString(), employeesResult))
如果您不能添加构造函数参数,那么只需定义一个工厂方法

.Select(department => CreateDepartment(department["Name"].ToString(), employeesResult))

...

static Department CreateDepartment(string name, IEnumerable<Employee> employees)
{
  var department = new Department()
  {
    Name = name
  };

  foreach (var employee in employees)
  {
    department.Employees.Add(employee);
  }

  return department;
}

如果可以,请添加构造函数参数。毕竟,如果构造函数已经在创建一个空列表并附加一个事件处理程序,那么它也应该能够创建一个填充列表

.Select(department => new Department(department["Name"].ToString(), employeesResult))
如果您不能添加构造函数参数,那么只需定义一个工厂方法

.Select(department => CreateDepartment(department["Name"].ToString(), employeesResult))

...

static Department CreateDepartment(string name, IEnumerable<Employee> employees)
{
  var department = new Department()
  {
    Name = name
  };

  foreach (var employee in employees)
  {
    department.Employees.Add(employee);
  }

  return department;
}

如果可以,请添加构造函数参数。毕竟,如果构造函数已经在创建一个空列表并附加一个事件处理程序,那么它也应该能够创建一个填充列表

.Select(department => new Department(department["Name"].ToString(), employeesResult))
如果您不能添加构造函数参数,那么只需定义一个工厂方法

.Select(department => CreateDepartment(department["Name"].ToString(), employeesResult))

...

static Department CreateDepartment(string name, IEnumerable<Employee> employees)
{
  var department = new Department()
  {
    Name = name
  };

  foreach (var employee in employees)
  {
    department.Employees.Add(employee);
  }

  return department;
}


定义
员工
的设置者来执行工作。请显示问题所在事件的代码。最好是把它固定在这一端而不是这一端。什么类型的部门是
部门
。从表面上看,这是一本字典。还有什么阻止您创建以[department,employeesResult]为参数的参数化构造函数。这样,您就可以在内部处理初始化。定义
员工的setter
来执行此工作。请显示问题所在事件的代码。最好是把它固定在这一端而不是这一端。什么类型的部门是
部门
。从表面上看,这是一本字典。还有什么阻止您创建以[department,employeesResult]为参数的参数化构造函数。这样,您就可以在内部处理初始化。定义
员工的setter
来执行此工作。请显示问题所在事件的代码。最好是把它固定在这一端而不是这一端。什么类型的部门是
部门
。从表面上看,这是一本字典。还有什么阻止您创建以[department,employeesResult]为参数的参数化构造函数。这样,您就可以在内部处理初始化。定义
员工的setter
来执行此工作。请显示问题所在事件的代码。最好是把它固定在这一端而不是这一端。什么类型的部门是
部门
。从表面上看,这是一本字典。还有什么阻止您创建以[department,employeesResult]为参数的参数化构造函数。这样您就可以在内部处理初始化。在对象初始值设定项中不能使用任意语句。Erti-Chris,谢谢。您的解决方案也可以运行,无需使用Employees=department.Employees行(尽管这可能是由于我的特定用例,而不是您的代码有问题)。另外,感谢您将我加入AddRange——我现在可以放弃我的自定义“AddMany”方法了。:)不能在对象初始值设定项中使用任意语句。Erti-Chris,谢谢。您的解决方案也可以运行,无需使用Employees=department.Employees行(尽管这可能是由于我的特定用例,而不是您的代码有问题)。另外,感谢您将我加入AddRange——我现在可以放弃我的自定义“AddMany”方法了。:)不能在对象初始值设定项中使用任意语句。Erti-Chris,谢谢。您的解决方案也可以运行,无需使用Employees=department.Employees行(尽管这可能是由于我的特定用例,而不是您的代码有问题)。另外,感谢您将我加入AddRange——我现在可以放弃我的自定义“AddMany”方法了。:)不能在对象初始值设定项中使用任意语句。Erti-Chris,谢谢。您的解决方案也可以运行,无需使用Employees=department.Employees行(尽管这可能是由于我的特定用例,而不是您的代码有问题)。另外,感谢您将我加入AddRange——我现在可以放弃我的自定义“AddMany”方法了。:)戴夫,谢谢你。lambda代码块解决方案正是我想要的。这个解决方案最适合我。我也很感激你的替代方案。戴夫,谢谢你。lambda代码块解决方案正是我想要的。此解决方案在以下情况下效果最佳: