206 Stimmen

Wie konvertiert man eine DataTable in eine generische Liste?

Derzeit verwende ich:

DataTable dt = CreateDataTableInSomeWay();

List<DataRow> list = new List<DataRow>(); 
foreach (DataRow dr in dt.Rows)
{
    list.Add(dr);
}

Gibt es einen besseren/zauberhaften Weg?

304voto

Jon Skeet Punkte 1325502

Wenn Sie .NET 3.5 verwenden, können Sie DataTableExtensions.AsEnumerable (eine Erweiterungsmethode) und dann, wenn Sie wirklich eine List<DataRow> statt nur IEnumerable<DataRow> können Sie anrufen Enumerable.ToList :

IEnumerable<DataRow> sequence = dt.AsEnumerable();

o

using System.Linq;
...
List<DataRow> list = dt.AsEnumerable().ToList();

71voto

darshan pandya Punkte 701
List<Employee> emp = new List<Employee>();

//Maintaining DataTable on ViewState
//For Demo only

DataTable dt = ViewState["CurrentEmp"] as DataTable;

//read data from DataTable 
//using lamdaexpression

emp = (from DataRow row in dt.Rows

   select new Employee
   {
       _FirstName = row["FirstName"].ToString(),
       _LastName = row["Last_Name"].ToString()

   }).ToList();

44voto

Marc Gravell Punkte 970173

Mit C# 3.0 und System.Data.DataSetExtensions.dll,

List<DataRow> rows = table.Rows.Cast<DataRow>().ToList();

37voto

Kibbee Punkte 64039

Sie könnten verwenden

List<DataRow> list = new List<DataRow>(dt.Select());

dt.Select() gibt alle Zeilen in Ihrer Tabelle als Array von Datenzeilen zurück, und die List Konstruktor akzeptiert dieses Array von Objekten als Argument, mit dem Sie Ihre Liste anfänglich füllen.

18voto

Rahul Garg Punkte 3765

Sie können eine Erweiterungsfunktion erstellen als :

public static List<T> ToListof<T>(this DataTable dt)
{
    const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
    var columnNames = dt.Columns.Cast<DataColumn>()
        .Select(c => c.ColumnName)
        .ToList();
    var objectProperties = typeof(T).GetProperties(flags);
    var targetList = dt.AsEnumerable().Select(dataRow =>
    {
        var instanceOfT = Activator.CreateInstance<T>();

        foreach (var properties in objectProperties.Where(properties => columnNames.Contains(properties.Name) && dataRow[properties.Name] != DBNull.Value))
        {
            properties.SetValue(instanceOfT, dataRow[properties.Name], null);
        }
        return instanceOfT;
    }).ToList();

    return targetList;
}

var output = yourDataInstance.ToListof<targetModelType>();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X