C# 将 DataTable 转换为 List<T>
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1427484/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert DataTable to List<T>
提问by Kris-I
I have an strongly typed DataTable of type MyType
, I'd like convert it in a List<MyType>
.
我有一个强类型的 DataTable 类型MyType
,我想将它转换为List<MyType>
.
How can I do this ?
我怎样才能做到这一点 ?
Thanks.
谢谢。
回答by Keith
There are Linq extension methods for DataTable.
DataTable 有 Linq 扩展方法。
Add reference to: System.Data.DataSetExtensions.dll
添加参考: System.Data.DataSetExtensions.dll
Then include the namespace: using System.Data.DataSetExtensions
然后包含命名空间: using System.Data.DataSetExtensions
Finally you can use Linq extensions on DataSet and DataTables:
最后,您可以在 DataSet 和 DataTables 上使用 Linq 扩展:
var matches = myDataSet.Tables.First().Where(dr=>dr.Field<int>("id") == 1);
On .Net 2.0 you can still add generic method:
在 .Net 2.0 上,您仍然可以添加通用方法:
public static List<T> ConvertRowsToList<T>( DataTable input, Convert<DataRow, T> conversion) {
List<T> retval = new List<T>()
foreach(DataRow dr in input.Rows)
retval.Add( conversion(dr) );
return retval;
}
回答by Adam Robinson
Assuming your DataRow
s inherit from your own type, say MyDataRowType
, this should work:
假设您的DataRow
s 继承自您自己的类型,例如MyDataRowType
,这应该有效:
List<MyDataRowType> list = new List<MyDataRowType>();
foreach(DataRow row in dataTable.Rows)
{
list.Add((MyDataRowType)row);
}
This is assuming, as you said in a comment, that you're using .NET 2.0 and don't have access to the LINQ extension methods.
正如您在评论中所说,这是假设您使用的是 .NET 2.0 并且无权访问 LINQ 扩展方法。
回答by Yuriy Faktorovich
The following does it in a single line:
以下是在一行中完成的:
dataTable.Rows.OfType<DataRow>()
.Select(dr => dr.Field<MyType>(columnName)).ToList();
[Edit: Add a reference to System.Data.DataSetExtensions
to your project if this does not compile]
[编辑:System.Data.DataSetExtensions
如果无法编译,请添加对您的项目的引用]
回答by abatishchev
IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(System.Data.DataSetExtensions.dll)IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();
(System.Core.dll)
IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(System.Data.DataSetExtensions.dll)IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();
(System.Core.dll)
回答by suneelsarraf
Data table to List
要列出的数据表
#region "getobject filled object with property reconized"
public List<T> ConvertTo<T>(DataTable datatable) where T : new()
{
List<T> Temp = new List<T>();
try
{
List<string> columnsNames = new List<string>();
foreach (DataColumn DataColumn in datatable.Columns)
columnsNames.Add(DataColumn.ColumnName);
Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsNames));
return Temp;
}
catch
{
return Temp;
}
}
public T getObject<T>(DataRow row, List<string> columnsName) where T : new()
{
T obj = new T();
try
{
string columnname = "";
string value = "";
PropertyInfo[] Properties;
Properties = typeof(T).GetProperties();
foreach (PropertyInfo objProperty in Properties)
{
columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
if (!string.IsNullOrEmpty(columnname))
{
value = row[columnname].ToString();
if (!string.IsNullOrEmpty(value))
{
if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null)
{
value = row[columnname].ToString().Replace("$", "").Replace(",", "");
objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
}
else
{
value = row[columnname].ToString().Replace("%", "");
objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);
}
}
}
}
return obj;
}
catch
{
return obj;
}
}
#endregion
IEnumerable collection To Datatable
IEnumerable 集合到数据表
#region "New DataTable"
public DataTable ToDataTable<T>(IEnumerable<T> collection)
{
DataTable newDataTable = new DataTable();
Type impliedType = typeof(T);
PropertyInfo[] _propInfo = impliedType.GetProperties();
foreach (PropertyInfo pi in _propInfo)
newDataTable.Columns.Add(pi.Name, pi.PropertyType);
foreach (T item in collection)
{
DataRow newDataRow = newDataTable.NewRow();
newDataRow.BeginEdit();
foreach (PropertyInfo pi in _propInfo)
newDataRow[pi.Name] = pi.GetValue(item, null);
newDataRow.EndEdit();
newDataTable.Rows.Add(newDataRow);
}
return newDataTable;
}
回答by Khalid Rafique
thanks for all of posts.... I have done it with using Linq Query, to view this please visit the following link
感谢所有帖子......我已经使用 Linq Query 完成了,要查看这个请访问以下链接
http://codenicely.blogspot.com/2012/02/converting-your-datatable-into-list.html
http://codenicely.blogspot.com/2012/02/converting-your-datatable-into-list.html
回答by user2660592
Create a list with type<DataRow>
by extend the datatable
with AsEnumerable
call.
<DataRow>
通过扩展datatable
withAsEnumerable
调用创建带有类型的列表。
var mylist = dt.AsEnumerable().ToList();
Cheers!! Happy Coding
干杯!!快乐编码
回答by Avinash shinde
Try this code and This is easiest way to convert datatable to list
试试这个代码,这是将数据表转换为列表的最简单方法
List<DataRow> listtablename = dataTablename.AsEnumerable().ToList();
回答by Richard YS
List<MyType> listName = dataTableName.AsEnumerable().Select(m => new MyType()
{
ID = m.Field<string>("ID"),
Description = m.Field<string>("Description"),
Balance = m.Field<double>("Balance"),
}).ToList()
回答by Hao
please try this code:
请试试这个代码:
public List<T> ConvertToList<T>(DataTable dt)
{
var columnNames = dt.Columns.Cast<DataColumn>()
.Select(c => c.ColumnName)
.ToList();
var properties = typeof(T).GetProperties();
return dt.AsEnumerable().Select(row =>
{
var objT = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
if (columnNames.Contains(pro.Name))
pro.SetValue(objT, row[pro.Name]);
}
return objT;
}).ToList();
}