使用LINQ将一个List复制到另一个List和SubList

时间:2012-04-26 08:05:13

标签: c# linq c#-4.0 linq-to-objects

我有一份员工列表,所有员工都有另一个嵌套列表,名为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> .............)));

感谢您的帮助和时间。

2 个答案:

答案 0 :(得分:4)

最好迭代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 :(得分: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());