DataTable to List

Comment prendre un DataTable et le convertir en liste?

J’ai inclus du code ci-dessous dans C # et VB.NET. Le problème, c’est que nous créons un nouvel object pour retourner les données, ce qui est très coûteux. J’ai besoin de renvoyer une référence à l’object.

L’object DataSetNoteProcsTableAdapters.up_GetNoteRow implémente l’interface INote.

J’utilise ADO.NET, ainsi que .NET 3.5

c # code

public static IList GetNotes() { DataSetNoteProcsTableAdapters.up_GetNoteTableAdapter adapter = new DataSetNoteProcsTableAdapters.up_GetNoteTableAdapter(); DataSetNoteProcs.up_GetNoteDataTable table = new DataSetNoteProcs.up_GetNoteDataTable(); IList notes = new List(); adapter.Connection = DataAccess.ConnectionSettings.Connection; adapter.Fill(table); foreach (DataSetNoteProcs.up_GetNoteRow t in table) { notes.Add((INote)t); } return notes; } 

Code VB.NET

 Public Shared Function GetNotes() As IList(Of INote) Dim adapter As New DataSetNoteProcsTableAdapters.up_GetNoteTableAdapter Dim table As New DataSetNoteProcs.up_GetNoteDataTable Dim notes As IList(Of INote) = New List(Of INote) adapter.Connection = DataAccess.ConnectionSettings.Connection adapter.Fill(table) For Each t As DataSetNoteProcs.up_GetNoteRow In table notes.Add(CType(t, INote)) Next Return notes End Function 

Non, créer une liste n’est pas coûteux. Comparé à la création de la table de données et à l’extraction des données de la firebase database, c’est très économique.

Vous pouvez le rendre encore moins cher en créant la liste après avoir rempli le tableau, de sorte que vous puissiez définir la capacité initiale en fonction du nombre de lignes que vous y placerez:

 IList notes = new List(table.Rows.Count); 

J’ai une autre approche qui pourrait valoir la peine d’être examinée. C’est une méthode d’assistance. Créez un fichier de classe personnalisé nommé CollectionHelper:

  public static IList ConvertTo(DataTable table) { if (table == null) return null; List rows = new List(); foreach (DataRow row in table.Rows) rows.Add(row); return ConvertTo(rows); } 

Imaginez que vous souhaitiez obtenir une liste de clients. Maintenant, vous aurez l’appelant suivant:

 List myList = (List)CollectionHelper.ConvertTo(table); 

Les atsortingbuts que vous avez dans votre DataTable doivent correspondre à votre classe de client (des champs tels que Nom, Adresse, Téléphone).

J’espère que ça aide!

Pour ceux qui veulent savoir pourquoi utiliser des listes au lieu de DataTables: link text

L’échantillon complet:

http://lozanotek.com/blog/archive/2007/05/09/Converting_Custom_Collections_To_and_From_DataTable.aspx

Pourquoi ne pas passer le DataTable dans la fonction au lieu de l’instancier? Cela contiendrait simplement une référence.

C’est une réponse bien trop simple qui en vaut la peine, j’en suis sûr, mais je ne vois pas en quoi cela ne résoudrait pas votre problème.

Pas sûr si c’est ce que vous cherchez, mais vous pouvez essayer quelque chose comme ça.

  public class Category { private int _Id; public int Id { get { return _Id; } set { _Id = value; } } private ssortingng _Name = null; public ssortingng Name { get { return _Name; } set { _Name = value; } } public Category() {} public static List GetCategories() { List currentCategories = new List(); DbCommand comm = GenericDataAccess.CreateTextCommand(); comm.CommandText = "SELECT Id, Name FROM Categories Order By Name"; DataTable table = GenericDataAccess.ExecuteSelectCommand(comm); foreach (DataRow row in table.Rows) { Category cat = new Category(); cat.Id = int.Parse(row["Id"].ToSsortingng()); cat.Name = row["Name"].ToSsortingng(); currentCategories.Add(cat); } return currentCategories; } } 

C’est ce que j’ai fait, alors espérons que cela aidera. Je ne sais pas si c’est la bonne façon de le faire, mais cela fonctionne pour ce dont nous avions besoin.

Voulez-vous référencer les lignes de la table? Dans ce cas, vous devez utiliser la propriété DataTable.Rows.

Essaye ça:

 notes.AddRange(table.Rows); 

Si les lignes de la table implémentent INote, cela devrait fonctionner.

Sinon, vous pouvez faire ce que vous avez fait ci-dessus:

 foreach (INote note in table.Rows) { notes.Add(note) } 

Si les propriétés de la liste correspondent aux noms de champs dans le datatable, vous devriez pouvoir créer une sorte de routine de reflection générique.