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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 16:25:34  来源:igfitidea点击:

Convert DataTable to List<T>

c#.netgenericsdatatable

提问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 DataRows inherit from your own type, say MyDataRowType, this should work:

假设您的DataRows 继承自您自己的类型,例如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.DataSetExtensionsto your project if this does not compile]

[编辑System.Data.DataSetExtensions如果无法编译,请添加对您的项目的引用]

回答by abatishchev

  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable();(System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();(System.Core.dll)
  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable();(System.Data.DataSetExtensions.dll)
  2. 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 datatablewith AsEnumerablecall.

<DataRow>通过扩展datatablewithAsEnumerable调用创建带有类型的列表。

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();
}