我想用下面的示例数据转换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。
答案 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.Parse
和decimal.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
。