1

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

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

进入

列表。

其中员工对象如下..

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

}

任何人都可以帮助我将此数据表转换为 c 中的列表或使用 linq。

4

4 回答 4

4

所以动态主题列从索引 1 开始,到table.Columns-Count-1. 然后我会首先创建这些列的数组。然后你可以使用Select++ ToDictionaryToList

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.Parseanddecimal.Parse来转换它们。

于 2013-04-25T07:28:05.880 回答
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);
    }
于 2013-04-25T07:30:37.037 回答
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()
于 2013-04-25T07:23:32.413 回答
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.

于 2013-04-25T07:27:07.570 回答