Wenn Sie .NET 3.5 verwenden, können Sie DataTableExtensions.AsEnumerable(eine Erweiterungsmethode) verwenden. Wenn Sie wirklich eine benötigen , können Sie List<DataRow>statt nur IEnumerable<DataRow>Folgendes aufrufen Enumerable.ToList:
@ Pandiya: Es gibt verschiedene Möglichkeiten, Daten in .NET in JSON zu konvertieren. Persönlich habe ich immer die JSON.NET-Bibliothek verwendet, aber es gibt auch andere Ansätze.
Der obige Code funktioniert möglicherweise nicht bcs. dt.Rows hat 'AsEnumerable' nicht implementiert. Dies kann wie folgt korrigiert werden: emp = (aus der DataRow-Zeile in dt.AsEnumerable () neuen Mitarbeiter auswählen {_FirstName = Zeile ["Vorname"]. ToString (), _LastName = Zeile ["Nachname"]. ToString ()}) .Auflisten();
Dies hat die Leistung verbessert, indem nur ein foreach über einen Datenbereich um 50% der Zeit verwendet wurde.
Lloydom
33
Du könntest benutzen
List<DataRow>list=newList<DataRow>(dt.Select());
dt.Select()gibt alle Zeilen in Ihrer Tabelle als Array von Datenzeilen zurück, und der ListKonstruktor akzeptiert dieses Array von Objekten als Argument, mit dem Ihre Liste zunächst gefüllt werden soll.
Funktioniert nicht - siehe dotnetfiddle.net/I22r2c Es sollte auch beachtet werden, dass die Verwendung von Reflection langsam ist und in leistungskritischem Code nicht empfohlen wird.
Almenon
Sie müssen Datentypinformationen für Spalten hinzufügen. DataTable dt = new DataTable (); dt.Columns.Add ("id", typeof (Int32)); dt.Columns.Add ("name", typeof (String)); dt.Columns.Add ("foo", typeof (DateTime)); für (int i = 0; i <= 1000; i ++) {dt.Rows.Add (i, "foo", DateTime.Now);}
Rahul Garg
Funktioniert jetzt. Vielen Dank.
Almenon
14
Wenn Sie nur eine Liste von Werten aus dem Feld "ID" int zurückgeben möchten, können Sie ...
List<int> ids =(from row in dt.AsEnumerable()selectConvert.ToInt32(row["ID"])).ToList();
DataTable.Select() gibt die Zeilen nicht in der Reihenfolge an, in der sie in der Datentabelle vorhanden waren.
Wenn die Reihenfolge wichtig ist, ist es meiner Meinung nach der richtige Weg, die Datenreihen-Sammlung zu durchlaufen und eine Liste zu erstellen, oder Sie könnten auch eine Überladung von verwenden DataTable.Select(string filterexpression, string sort) .
Diese Überlastung behandelt jedoch möglicherweise nicht alle von SQL bereitgestellten Bestellungen (z. B. Reihenfolge nach Fall ...).
DataTable dt;// datatable should contains datacolumns with Id,NameList<Employee> employeeList=newList<Employee>();// Employee should contain EmployeeId, EmployeeName as propertiesforeach(DataRow dr in dt.Rows){
employeeList.Add(newEmployee{EmployeeId=dr.Id,EmplooyeeName=dr.Name});}
/* This is a generic method that will convert any type of DataTable to a List
*
*
* Example : List< Student > studentDetails = new List< Student >();
* studentDetails = ConvertDataTable< Student >(dt);
*
* Warning : In this case the DataTable column's name and class property name
* should be the same otherwise this function will not work properly
*/
Das Folgende sind die beiden Funktionen, in denen, wenn wir eine DataTable und eine benutzerdefinierte Klasse übergeben. Anschließend wird die Liste dieser Klasse mit den DataTable-Daten zurückgegeben.
publicstaticList<T>ConvertDataTable<T>(DataTable dt){List<T> data =newList<T>();foreach(DataRow row in dt.Rows){
T item =GetItem<T>(row);
data.Add(item);}return data;}privatestatic T GetItem<T>(DataRow dr){Type temp =typeof(T);
T obj =Activator.CreateInstance<T>();foreach(DataColumn column in dr.Table.Columns){foreach(PropertyInfo pro in temp.GetProperties()){//in case you have a enum/GUID datatype in your model//We will check field's dataType, and convert the value in it.if(pro.Name== column.ColumnName){try{var convertedValue =GetValueByDataType(pro.PropertyType, dr[column.ColumnName]);
pro.SetValue(obj, convertedValue,null);}catch(Exception e){//ex handle code throw;}//pro.SetValue(obj, dr[column.ColumnName], null);}elsecontinue;}}return obj;}
Diese Methode überprüft den Datentyp des Felds und konvertiert den Wert von dataTable in diesen Datentyp.
Ändern Sie den Namen der Schülerklasse und den dt-Wert entsprechend Ihren Anforderungen. In diesem Fall sollten der Name der DataTable-Spalte und der Name der Klasseneigenschaft identisch sein, da diese Funktion sonst nicht ordnungsgemäß funktioniert.
Danke für deine Antwort. Es wäre großartig, wenn Sie Ihrem Code auch eine kurze Erklärung und einige Kommentare hinzufügen würden. Dies hilft den Menschen, Ihre Antwort besser zu verstehen.
Andre Hofmeister
0
Dies hat bei mir funktioniert: Benötigen Sie
mindestens .Net Framework 3.5. Der folgende
Code zeigt DataRow an. Generic.IEnumerable, comboBox1 wurde zur besseren Veranschaulichung verwendet.
using System.Linq;DataTable dt =newDataTable();
dt = myClass.myMethod();List<object>list=(from row in dt.AsEnumerable()select(row["name"])).ToList();
comboBox1.DataSource=list;
publicstaticclassExtensions{#region Convert Datatable To ListpublicstaticIList<T>ToList<T>(thisDataTable table)where T :new(){IList<PropertyInfo> properties =typeof(T).GetProperties().ToList();IList<T> result =newList<T>();foreach(var row in table.Rows){var item =CreateItemFromRow<T>((DataRow)row, properties);
result.Add(item);}return result;}privatestatic T CreateItemFromRow<T>(DataRow row,IList<PropertyInfo> properties)where T :new(){
T item =new T();foreach(var property in properties){
property.SetValue(item, row[property.Name],null);}return item;}#endregion}
So weisen Sie die DataTable-Zeilen der generischen Klassenliste zu
List<Candidate> temp =newList<Candidate>();//List that holds the Candidate Class,//Note:The Candidate class contains RollNo,Name and Department//tb is DataTable
temp =(fromDataRow dr in tb.RowsselectnewCandidate(){RollNO=Convert.ToInt32(dr["RollNO"]),Name= dr["Name"].ToString(),Department= dr["Department"].ToString(),}).ToList();
Sie können die folgenden zwei allgemeinen Funktionen verwenden
privatestaticList<T>ConvertDataTable<T>(DataTable dt){List<T> data =newList<T>();foreach(DataRow row in dt.Rows){
T item =GetItem<T>(row);
data.Add(item);}return data;}privatestatic T GetItem<T>(DataRow dr){Type temp =typeof(T);
T obj =Activator.CreateInstance<T>();foreach(DataColumn column in dr.Table.Columns){foreach(PropertyInfo pro in temp.GetProperties()){if(pro.Name== column.ColumnName)
pro.SetValue(obj, dr[column.ColumnName].ToString(),null);elsecontinue;}}return obj;}
Antworten:
Wenn Sie .NET 3.5 verwenden, können Sie
DataTableExtensions.AsEnumerable
(eine Erweiterungsmethode) verwenden. Wenn Sie wirklich eine benötigen , können SieList<DataRow>
statt nurIEnumerable<DataRow>
Folgendes aufrufenEnumerable.ToList
:oder
quelle
list
in json umwandelt .quelle
Mit C # 3.0 und System.Data.DataSetExtensions.dll
quelle
Du könntest benutzen
dt.Select()
gibt alle Zeilen in Ihrer Tabelle als Array von Datenzeilen zurück, und derList
Konstruktor akzeptiert dieses Array von Objekten als Argument, mit dem Ihre Liste zunächst gefüllt werden soll.quelle
Sie können eine Erweiterungsfunktion erstellen als:
quelle
Wenn Sie nur eine Liste von Werten aus dem Feld "ID" int zurückgeben möchten, können Sie ...
quelle
Ich habe den Code aus dieser Antwort ( https://stackoverflow.com/a/24588210/4489664 ) geändert, da bei nullbaren Typen eine Ausnahme zurückgegeben wird
quelle
quelle
Mit 3.5 können Sie es wieder wie folgt machen:
BRGDS
quelle
Hier ist eine DataTable-Erweiterungsmethode, die eine DataTable in eine generische Liste konvertiert.
https://gist.github.com/gaui/a0a615029f1327296cf8
Verwendung:
quelle
Ein "magischerer" Weg, und .NET 3.5 wird nicht benötigt.
Wenn Sie beispielsweise
DBDatatable
eine einzelne Spalte mit Guids (eindeutige Kennung in SQL) zurückgeben, können Sie Folgendes verwenden:quelle
quelle
DataTable.Select()
gibt die Zeilen nicht in der Reihenfolge an, in der sie in der Datentabelle vorhanden waren.Wenn die Reihenfolge wichtig ist, ist es meiner Meinung nach der richtige Weg, die Datenreihen-Sammlung zu durchlaufen und eine Liste zu erstellen, oder Sie könnten auch eine Überladung von verwenden
DataTable.Select(string filterexpression, string sort)
.Diese Überlastung behandelt jedoch möglicherweise nicht alle von SQL bereitgestellten Bestellungen (z. B. Reihenfolge nach Fall ...).
quelle
quelle
Verwenden Sie den
System.Data
Namespace, dann erhalten Sie.AsEnumerable()
.quelle
quelle
Dies hat bei mir funktioniert: Benötigen Sie mindestens .Net Framework 3.5. Der folgende Code zeigt DataRow an. Generic.IEnumerable, comboBox1 wurde zur besseren Veranschaulichung verwendet.
quelle
Ausgabe
quelle
Wir können eine generische Methode verwenden zur Umwandlung
DataTable
zuList
anstatt manuell eine UmwandlungDataTable
zuList
.Hinweis:
DataTable
'sColumnName
undType
' sPropertyName
sollten gleich sein.Rufen Sie die folgende Methode auf:
quelle
Sie können eine solche generische Methode für Daten verwenden, die auf generische Listen datiert werden können
quelle
Umstellung
DataTable
auf GenericDictionary
quelle
Verwenden Sie die Erweiterung:
quelle
So weisen Sie die DataTable-Zeilen der generischen Klassenliste zu
quelle
Die einfachste Möglichkeit, die DataTable in die generische Klassenliste zu konvertieren
mit Newtonsoft.Json;
quelle
Sie können die folgenden zwei allgemeinen Funktionen verwenden
und verwenden Sie es wie folgt
quelle
Link zum funktionierenden DotNetFiddle-Beispiel
}}
quelle