Powyższy kod może nie działać Bcs. dt.Rows nie wdrożył „AsEnumerable”. Można to poprawić w następujący sposób: emp = (z wiersza DataRow w dt.AsEnumerable () wybierz nowego pracownika {_FirstName = wiersz [„FirstName”]. ToString (), _LastName = row [„Last_Name”]. ToString ()}) .Notować();
Navin Pandit
37
W wersji C # 3.0 i System.Data.DataSetExtensions.dll
robienie tego pomogło wydajności po prostu używając foreacha nad datarow o 50% czasu.
lloydom
33
Możesz użyć
List<DataRow>list=newList<DataRow>(dt.Select());
dt.Select()zwróci wszystkie wiersze w tabeli jako tablicę datarows, a Listkonstruktor zaakceptuje tę tablicę obiektów jako argument do początkowego wypełnienia listy.
Nie działa - patrz dotnetfiddle.net/I22r2c Należy również zauważyć, że używanie Reflection jest powolne i nie jest zalecane w kodzie krytycznym dla wydajności.
Almenon
Musisz dodać informacje o typie danych dla kolumn. DataTable dt = new DataTable (); dt.Columns.Add ("id", typeof (Int32)); dt.Columns.Add („name”, typeof (String)); dt.Columns.Add („foo”, typeof (DateTime)); for (int i = 0; i <= 1000; i ++) {dt.Rows.Add (i, "foo", DateTime.Now);}
Rahul Garg
Działa teraz Dzięki.
Almenon
14
Jeśli chcesz tylko zwrócić listę wartości z pola int „ID”, możesz użyć ...
List<int> ids =(from row in dt.AsEnumerable()selectConvert.ToInt32(row["ID"])).ToList();
DataTable.Select() nie podaje wierszy w kolejności, w jakiej występowały w danych.
Jeśli kolejność jest ważna, wydaje mi się, że iteruję po kolekcji datarow i tworzenie listy jest właściwą drogą, możesz też użyć przeciążenia DataTable.Select(string filterexpression, string sort).
Ale to przeciążenie może nie obsłużyć całego porządku (jak kolejność według przypadków ...), który zapewnia SQL.
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
*/
Poniżej znajdują się dwie funkcje, w których przekazujemy tabelę danych i klasę zdefiniowaną przez użytkownika. Następnie zwróci listę tej klasy z danymi DataTable.
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;}
Ta metoda sprawdzi typ danych pola i skonwertuje wartość dataTable na ten typ danych.
Zmień nazwę klasy Studenta i wartość dt zgodnie z własnymi wymaganiami. W takim przypadku nazwa kolumny DataTable i nazwa właściwości klasy powinny być takie same, w przeciwnym razie ta funkcja nie będzie działać poprawnie.
Dziękuję za odpowiedź. Byłoby wspaniale, gdybyś dodał również krótkie wyjaśnienie i kilka komentarzy do swojego kodu. Pomaga to ludziom lepiej zrozumieć twoją odpowiedź.
Andre Hofmeister
0
To działało dla mnie:
Potrzebuję przynajmniej .Net Framework 3.5,
poniższy kod wyświetla DataRow zwrócony do Generic.IEnumerable, comboBox1 został użyty dla lepszej ilustracji.
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}
Aby przypisać wiersze DataTable do ogólnej listy klas
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();
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;}
Odpowiedzi:
Jeśli używasz .NET 3.5, możesz użyć
DataTableExtensions.AsEnumerable
(metody rozszerzenia), a jeśli naprawdę potrzebujeszList<DataRow>
zamiastIEnumerable<DataRow>
, możesz zadzwonićEnumerable.ToList
:lub
źródło
list
na json.źródło
W wersji C # 3.0 i System.Data.DataSetExtensions.dll
źródło
Możesz użyć
dt.Select()
zwróci wszystkie wiersze w tabeli jako tablicę datarows, aList
konstruktor zaakceptuje tę tablicę obiektów jako argument do początkowego wypełnienia listy.źródło
Możesz utworzyć funkcję rozszerzenia jako:
źródło
Jeśli chcesz tylko zwrócić listę wartości z pola int „ID”, możesz użyć ...
źródło
Dodałem trochę modyfikacji do kodu z tej odpowiedzi ( https://stackoverflow.com/a/24588210/4489664 ), ponieważ dla typów zerowalnych zwróci wyjątek
źródło
źródło
Ponownie, używając 3.5 możesz to zrobić w następujący sposób:
BRGDS
źródło
Oto metoda rozszerzenia DataTable, która konwertuje DataTable na ogólną listę.
https://gist.github.com/gaui/a0a615029f1327296cf8
Stosowanie:
źródło
Bardziej „magiczny” sposób i nie wymaga .NET 3.5.
Jeśli na przykład
DBDatatable
zwracała jedną kolumnę Guids (unikalny identyfikator w SQL), możesz użyć:źródło
źródło
DataTable.Select()
nie podaje wierszy w kolejności, w jakiej występowały w danych.Jeśli kolejność jest ważna, wydaje mi się, że iteruję po kolekcji datarow i tworzenie listy jest właściwą drogą, możesz też użyć przeciążenia
DataTable.Select(string filterexpression, string sort)
.Ale to przeciążenie może nie obsłużyć całego porządku (jak kolejność według przypadków ...), który zapewnia SQL.
źródło
źródło
Użyj
System.Data
przestrzeni nazw, a otrzymasz.AsEnumerable()
.źródło
źródło
To działało dla mnie: Potrzebuję przynajmniej .Net Framework 3.5, poniższy kod wyświetla DataRow zwrócony do Generic.IEnumerable, comboBox1 został użyty dla lepszej ilustracji.
źródło
Wynik
źródło
Możemy użyć metody ogólnej do konwersji
DataTable
naList
zamiast ręcznej konwersjiDataTable
naList
.Uwaga:
DataTable
„sColumnName
iType
” sPropertyName
powinna być taka sama.Wywołaj poniższą metodę:
źródło
Możesz użyć ogólnej metody takiej jak w przypadku listy danych generycznej
źródło
Konwertowanie
DataTable
na ogólnyDictionary
źródło
Użyj rozszerzenia:
źródło
Aby przypisać wiersze DataTable do ogólnej listy klas
źródło
Najłatwiejszy sposób przekształcenia tabeli danych w ogólną listę klas
using Newtonsoft.Json;
źródło
możesz użyć następujących dwóch ogólnych funkcji
i użyj go w następujący sposób
źródło
Link do działającego przykładu DotNetFiddle
}
źródło