将DataTable(动态列)转换为List <t> </t>

时间:2013-04-25 07:15:44

标签: c# linq

我想用下面的示例数据转换DataTable

Employee subject1 subject2 subject3 .......
1        100      80         60......
2        90       70         70...

列表。

Employee对象如下所示..

public class Employee
{
  public int EmpId { get; set;}
  public Dictionary<string,decimal> SubjectMarks;

}

任何人都可以帮我将这个数据表转换为c sharp或使用linq。

4 个答案:

答案 0 :(得分:4)

因此,动态主题列从索引1开始,到table.Columns-Count-1结束。然后我会先创建这些列的数组。然后,您可以使用Select + ToDictionary + ToList

DataColumn[] subjectColumns = table.Columns.Cast<DataColumn>().Skip(1).ToArray();
List<Employee> employee = table.AsEnumerable()
    .Select(r => new Employee
    {
        EmpId = r.Field<int>("Employee"),
        SubjectMarks = subjectColumns.Select(c => new
        {
            Subject = c.ColumnName,
            Marks   = r.Field<decimal>(c)
        })
        .ToDictionary(x => x.Subject, x => x.Marks)
    }).ToList();

假设列的类型已经int用于ID,decimal用于标记。否则,请使用int.Parsedecimal.Parse进行转换。

答案 1 :(得分:1)

    var list = new List<Employee>();
    var id = table.Columns[0];
    var marks = table.Columns.Cast<DataColumn>().Skip(1).ToArray();
    foreach (DataRow row in table.Rows)
    {
        var obj = new Employee { EmpId = (int) row[id] };
        var dict = new Dictionary<string,decimal>();
        foreach (var mark in marks)
        {
            dict[mark.ColumnName] = (decimal)row[mark];
        }
        obj.SubjectMarks = dict;
        list.Add(obj);
    }

答案 2 :(得分:0)

您可以使用列表添加主题成绩,而不是使用词典 试试这个:

public class Employee
{
  public int EmpId { get; set;}
  public List<string> SubjectMarks { get; set;}
}


var empList = (from emp in dtEmployeeList.AsEnumerable()
               select new Employee()
               {
                   EmpId = (int) emp["Employee"],
                   SubjectMarks = List<string>() 
                   {
                       emp["subject1"].ToString(),
                       emp["subject2"].ToString(),
                       emp["subject3"].ToString()
                   }
               }).ToList()

答案 3 :(得分:0)

你可以这样做:

System.Data.DataTable table = // your table 
List<Employee> result =
    table.AsEnumerable().Select(i => new Employee()
        {
            EmpId = i.Field<int>("Employee"),
            SubjectMarks = { { "subject1", i.Field<decimal>("subject1") } ,
                             { "subject2", i.Field<decimal>("subject2") } ,
                             { "subject3", i.Field<decimal>("subject3") } }
        }).ToList();

您需要确保引用System.Data.DataSetExtensions。并且不要忘记添加using System.Data