2013-04-25 4 views
1

Я хочу, чтобы преобразовать DataTable с ниже выборочных данныхПреобразовать DataTable (динамические столбцы) в список <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 к списку диез или с помощью 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.Parse и decimal.Parse для их преобразования.

+0

+1 Лучший способ сделать словарную часть. –

+0

Спасибо, что это сработало .. Мне понравился способ, реализованный через Linq ... – Beginner

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 не 'Список ' это 'Dictionary' –

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

+0

Спасибо за ответ..Approach выглядят просто и аккуратно – Beginner

Смежные вопросы