Если вы используете .NET 3.5, вы можете использовать DataTableExtensions.AsEnumerable(метод расширения), а затем, если вам действительно нужно, а List<DataRow>не просто, IEnumerable<DataRow>вы можете вызвать Enumerable.ToList:
Выше код может не работать BCS. В dt.Rows не реализовано «AsEnumerable». Это можно исправить следующим образом: emp = (из строки DataRow в dt.AsEnumerable () выберите нового Employee {_FirstName = row ["FirstName"]. ToString (), _LastName = row ["Last_Name"]. ToString ()}) .К списку();
это помогло повысить производительность от использования foreach над датаровым в 50% случаев.
Ллойдом
33
Вы могли бы использовать
List<DataRow>list=newList<DataRow>(dt.Select());
dt.Select()вернет все строки в вашей таблице в виде массива данных, и Listконструктор примет этот массив объектов в качестве аргумента для первоначального заполнения вашего списка.
Не работает - см. Dotnetfiddle.net/I22r2c Следует также отметить, что использование Reflection является медленным и не рекомендуется в критически важном коде производительности.
Альменон
Вам необходимо добавить информацию о типе данных для столбцов. DataTable dt = new DataTable (); dt.Columns.Add ("id", typeof (Int32)); dt.Columns.Add ( "имя", TypeOf (String)); dt.Columns.Add ("foo", typeof (DateTime)); for (int i = 0; i <= 1000; i ++) {dt.Rows.Add (i, "foo", DateTime.Now);}
Рахул Гарг
Работает сейчас. Спасибо.
Альменон
14
Если вы просто хотите получить список значений из возвращаемого поля «ID», вы можете использовать ...
List<int> ids =(from row in dt.AsEnumerable()selectConvert.ToInt32(row["ID"])).ToList();
Я добавил некоторые изменения в код из этого ответа ( https://stackoverflow.com/a/24588210/4489664 ), потому что для типов, допускающих обнуление, он будет возвращать исключение
publicstaticList<T>DataTableToList<T>(thisDataTable table)where T:new(){List<T>list=newList<T>();var typeProperties =typeof(T).GetProperties().Select(propertyInfo =>new{PropertyInfo= propertyInfo,Type=Nullable.GetUnderlyingType(propertyInfo.PropertyType)?? propertyInfo.PropertyType}).ToList();foreach(var row in table.Rows.Cast<DataRow>()){
T obj =new T();foreach(var typeProperty in typeProperties){objectvalue= row[typeProperty.PropertyInfo.Name];object safeValue =value==null||DBNull.Value.Equals(value)?null:Convert.ChangeType(value, typeProperty.Type);
typeProperty.PropertyInfo.SetValue(obj, safeValue,null);}list.Add(obj);}returnlist;}
DataTable.Select() не дает строки в том порядке, в котором они присутствовали в таблице данных.
Если порядок важен, я чувствую, что перебираю коллекцию datarow, и формирование списка - это правильный путь, или вы также можете использовать перегрузку DataTable.Select(string filterexpression, string sort) .
Но эта перегрузка может не обрабатывать все упорядочения (например, порядок в каждом случае ...), которые обеспечивает 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
*/
Ниже приведены две функции, в которых, если мы передадим DataTable и пользовательский класс. Затем он вернет список этого класса с данными 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;}
Этот метод проверяет тип данных поля и преобразует значение dataTable в этот тип данных.
Измените имя класса Student и значение dt в соответствии с вашими требованиями. В этом случае имя столбца DataTable и имя свойства класса должны совпадать, иначе эта функция не будет работать должным образом.
Спасибо за Ваш ответ. Было бы здорово, если бы вы также добавили краткое пояснение и несколько комментариев к своему коду. Это помогает людям лучше понять ваш ответ.
Андре Хофмайстер
0
Это сработало для меня:
нужен по крайней мере .Net Framework 3.5,
код ниже отображает DataRow, превращенный в Generic.IEnumerable, comboBox1 был использован для лучшей иллюстрации.
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}
Чтобы назначить строки DataTable общему списку классов
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;}
Ответы:
Если вы используете .NET 3.5, вы можете использовать
DataTableExtensions.AsEnumerable
(метод расширения), а затем, если вам действительно нужно, аList<DataRow>
не просто,IEnumerable<DataRow>
вы можете вызватьEnumerable.ToList
:или
источник
list
в JSON.источник
С C # 3.0 и System.Data.DataSetExtensions.dll,
источник
Вы могли бы использовать
dt.Select()
вернет все строки в вашей таблице в виде массива данных, иList
конструктор примет этот массив объектов в качестве аргумента для первоначального заполнения вашего списка.источник
Вы можете создать функцию расширения как:
источник
Если вы просто хотите получить список значений из возвращаемого поля «ID», вы можете использовать ...
источник
Я добавил некоторые изменения в код из этого ответа ( https://stackoverflow.com/a/24588210/4489664 ), потому что для типов, допускающих обнуление, он будет возвращать исключение
источник
источник
Опять же, используя 3.5, вы можете сделать это следующим образом:
BRGDS
источник
Вот метод расширения DataTable, который преобразует DataTable в общий список.
https://gist.github.com/gaui/a0a615029f1327296cf8
Использование:
источник
Более «волшебный» способ, не требующий .NET 3.5.
Например, если вы
DBDatatable
возвращаете один столбец Guids (uniqueidentifier в SQL), вы можете использовать:источник
источник
DataTable.Select()
не дает строки в том порядке, в котором они присутствовали в таблице данных.Если порядок важен, я чувствую, что перебираю коллекцию datarow, и формирование списка - это правильный путь, или вы также можете использовать перегрузку
DataTable.Select(string filterexpression, string sort)
.Но эта перегрузка может не обрабатывать все упорядочения (например, порядок в каждом случае ...), которые обеспечивает SQL.
источник
источник
Используйте
System.Data
пространство имен, тогда вы получите.AsEnumerable()
.источник
источник
Это сработало для меня: нужен по крайней мере .Net Framework 3.5, код ниже отображает DataRow, превращенный в Generic.IEnumerable, comboBox1 был использован для лучшей иллюстрации.
источник
Вывод
источник
Мы можем использовать метод Generic для преобразования
DataTable
вList
вместо того , чтобы вручную преобразованияDataTable
вList
.Примечание:
DataTable
«sColumnName
иType
» sPropertyName
должен быть одинаковым.Вызовите метод ниже:
источник
Вы можете использовать универсальный метод, подобный этому, для ввода данных в общий список
источник
Преобразование
DataTable
в ОбщийDictionary
источник
Используйте расширение:
источник
Чтобы назначить строки DataTable общему списку классов
источник
Самый простой способ преобразования DataTable в общий список классов
используя Newtonsoft.Json;
источник
Вы можете использовать следующие две общие функции
и используйте его следующим образом
источник
Ссылка на работающий пример DotNetFiddle
}
источник