使用LINQ将一个列表复制到另一个列表并复制子列表

4
我有一个员工列表,其中每个员工都有另一个嵌套的列表,称为EmployeeValuesCollection。
因此,我的类大致如下:-
public Employee(int employeeID, string jobTitle, int companyID, 
        List<EmployeeValues> employeeValuesCollection)
{
      EmployeeID = employeeID;
      JobTitle = jobTitle;
      CompanyID = companyID;
      EmployeeValuesCollection = employeeValuesCollection;
 }

现在我想使用LINQ从另一个对象填充这个对象,到目前为止我有:-
List<DataFileRow> dataFiles = dfRow.Rows;
dataFiles
     .ForEach(l => employeeList
                      .Add(new Employee(l.EmpID, l.JobTitle, l.CompID)));

这是英语文本,翻译为中文如下:

这样做可以,但我不知道如何在语句中添加employeeValuesCollection。这可行吗?

所以我想的是:

dataFiles
     .ForEach(l => employeeList
                     .Add(new Employee(l.EmpID, l.JobTitle, l.CompID, 
                          new List<EmployeeValuesCollection> .............)));

感谢您的帮助和时间。

1
好的,那么这样是行不通的。你不能将一个 List<EmployeeValuesCollection> 赋值给一个单独的 EmployeeValuesCollection。你到底想要赋什么值? - Alexander R
好的,基本上我正在获取一个对象,其中包含一个员工,然后是每个员工附加的变量列表。现在我想在我的类中获取这些值,以便我可以操作我想要的数据。我得到的对象与我的对象完全相同,但具有不同的属性名称。 - JMon
EmployeeValuesCollection 的值应该如何处理(假设它们可能是多个),它们是否属于 dataFiles - V4Vendetta
是的,基本上一个数据文件将有一个员工,然后是一个值的List<>,但是在List<Values>中我需要更多的细节,这就是为什么我正在创建自己的对象。 - JMon
1
在dataFiles中,哪些属性组成了你想要放入EmployeeValuesCollection对象中的属性? - dezfowler
基本上有三个属性我真的需要,标题、值和是否可见。 - JMon
2个回答

5

最好在Employee构造函数内部遍历输入参数employeeValuesCollection列表,创建一个类型为EmployeeValues的本地变量,并将其添加到Employee类的实例列表变量中。如果我们使用EmployeeValuesCollection = employeeValuesCollection;,我们实际上是分配引用。因此,如果我们修改employeeValuesCollection的某些值,相同的更改将反映到EmployeeValuesCollection中。

public Employee(int employeeID, string jobTitle, int companyID, List<EmployeeValues> employeeValuesCollection)
    {
        EmployeeID = employeeID;
        JobTitle = jobTitle;
        CompanyID = companyID;

        foreach (var obj in employeeValuesCollection)
        {
            var empVal = new EmployeeValues() { Name = obj.Name};
            EmployeeValuesCollection.Add(empVal);
        }

您可以使用LINQ语句如下:

dataFiles.ForEach(l => employeeList.Add(new Employee(l.EmpID, l.JobTitle, l.CompID, l.EmployeeValuesCollection)));

1

您可以在每一行上使用 Linq 投影。我将使用“正确”的 Linq 进行操作:

employeeList = (from r in dfRow.Rows
  select new Employee(r.EmpID, r.JobTitle, r.CompID, 
   new List<EmployeeValues>(/*parameter*/))).ToList();

在你指定了EmployeeValues实际上是什么(以及它们从DataFileRow的哪个属性中访问)之前,很难再说更多。但假设它只是更多的属性,我会总结它们就像键/值对一样(尽管类型名称使用了复数形式,这有点令人困惑)。

我从你在问题的第三条评论中提取了这些名称,并假设DataFileRow类型将这些值公开为名为EmployeeValues的IEnumerable。基于此,您可以使用内部投影。

employeeList = (from r in dfRow.Rows
  select new Employee(r.EmpID, r.JobTitle, r.CompID, 
   new List<EmployeeValue>((from v in r.EmployeeValues
    select new EmployeeValues(v.title, v.value, v.isVisible))).ToList());

谢谢Andras,那应该可以工作了,但是EmployeeValues并不像看起来那么简单。我会和创建该对象的开发人员交流,但我在其他地方尝试了你的代码,它可以工作。谢谢! - JMon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接