198 votes

Comment convertir une DataTable en une liste générique ?

Actuellement, j'utilise :

DataTable dt = CreateDataTableInSomeWay();

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

Existe-t-il un moyen meilleur/magique ?

3 votes

Qu'essayez-vous d'accomplir avec une liste que vous ne pouvez pas faire avec votre DataRowCollection ?

0 votes

Le mien est en retard mais j'espère qu'il sera utile. Solution de travail. stackoverflow.com/a/58607820/9048996

296voto

Jon Skeet Points 692016

Si vous utilisez .NET 3.5, vous pouvez utiliser DataTableExtensions.AsEnumerable (une méthode d'extension) et ensuite si vous avez vraiment besoin d'une List<DataRow> au lieu de simplement IEnumerable<DataRow> vous pouvez appeler Enumerable.ToList :

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

ou

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

1 votes

Comment convertir ceci list en json.

6 votes

@Pandiya : Il existe plusieurs façons de convertir des données en JSON dans .NET. Personnellement, j'ai toujours utilisé la bibliothèque JSON.NET, mais il existe aussi d'autres approches.

0 votes

70voto

darshan pandya Points 251
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();

1 votes

Le code ci-dessus peut ne pas fonctionner parce que dt.Rows n'a pas implémenté 'AsEnumerable'. Ceci peut être corrigé comme suit : emp = (from DataRow row in dt.AsEnumerable() select new Employee { _FirstName = row["FirstName"].ToString(), _LastName = row["Last_Name"].ToString() }).ToList() ;

38voto

Marc Gravell Points 482669

Avec C# 3.0 et System.Data.DataSetExtensions.dll,

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

3 votes

En procédant ainsi, les performances ont augmenté de 50 % par rapport à l'utilisation d'un foreach sur un datarow.

34voto

Kibbee Points 36474

Vous pourriez utiliser

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

dt.Select() retournera toutes les lignes de votre tableau, sous la forme d'un tableau de datarows, et la fonction List accepte ce tableau d'objets comme argument pour remplir initialement votre liste.

0 votes

Select() n'a pas besoin de paramètres. La surcharge sans paramètre renverrait toutes les lignes.

11voto

Morteza Points 1063
using System.Data;

var myEnumerable = myDataTable.AsEnumerable();

List<MyClass> myClassList =
    (from item in myEnumerable
     select new MyClass{
         MyClassProperty1 = item.Field<string>("DataTableColumnName1"),
         MyClassProperty2 = item.Field<string>("DataTableColumnName2")
    }).ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X