2013-04-25 34 views
1

我要與數據錶轉換下面的示例數據轉換數據表(動態列)到列表<T>

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; 

} 

誰能幫我在這個轉變中的DataTable升C或使用LINQ到列表。

回答

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來轉換它們。

+0

+1更好的方法來製作字典部分。 – 2013-04-25 07:38:23

+0

感謝它的工作..我喜歡通過Linq實施的方式... – Beginner 2013-04-25 09:36:35

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() 
+0

SubjectMarks不是'List '它是'Dictionary' – 2013-04-25 07:28:53

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

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); 
    } 
+0

我真的很喜歡這種方法。 – Derek 2013-04-25 07:35:21

+0

感謝您的答覆..方法看起來簡單和整齊 – Beginner 2013-04-25 09:37:18